[Tutor] registering iTunes with events now *sometimes* works
Orri Ganel
singingxduck at gmail.com
Mon Nov 20 04:42:08 CET 2006
Hello again, still on the topic of my iTunes related program and its issues
with catching events.
All right, so if anyone would be willing to test-drive my program and tell
me if it prints "playing" and "stopped" as it should on their computer, I'd
be extremely grateful. For no discernable reason, the code that worked fine
5 minutes ago now refuses to perform as it should, and I'm stumped again:
from Tkinter import *
import tkFont
from Tkconstants import *
from PIL import Image, ImageTk
import win32com.client, time, os, win32ui, win32con, win32gui, pythoncom
class FakeTrack:
def __init__(self, artist="No", album="Track", name="Selected",
track=None):
self.Artist = artist
self.Album = album
self.Name = name
self.TrackCount = 0
self.TrackNumber = 0
self.Duration = 0
self.GetITObjectIDs = lambda: None
self.Artwork = lambda x: ""
if track:
for key in self.__dict__:
self.__dict__[key] = getattr(track, key)
self.track = track
class Application(Frame):
def createWidgets(self):
self.artpic = Label(self, fg="white", bg="black")
try:
im = Image.open("C:\\Documents and
Settings\\Cookie\\Desktop\\temp.jpeg")
# im.thumbnail((600,600))
self.image = ImageTk.PhotoImage(im.resize((600,600)))
except:
self.image = None
self.artpic["image"] = self.image
self.artpic["text"] = "No Artwork"
self.artpic.pack()
self.trackslbl = Label(self, fg="white", bg="black")
self.trackslbl["text"] = "99"
self.trackslbl.place(relx=1,rely=1,x=-22,y=-55)
self.timeleftlbl = Label(self, fg="white", bg="black")
self.timeleftlbl["text"] = "00:00"
self.timeleftlbl.place(relx=1,rely=1,x=-32,y=-37)
self.skiptoendbtn = Button(self, fg="white", bg="black", font=
tkFont.Font(family="Courier", size=6, weight="bold"))
self.skiptoendbtn["text"] = ">|*"
self.skiptoendbtn.place(relx=1,rely=1,x=-54,y=-19)
self.skiptoendbtn.bind("<Button-1>", self.skiptoend)
self.skipendalbumbtn = Button(self, fg="white", bg="black", font=
tkFont.Font(family="Courier", size=6, weight="bold"))
self.skipendalbumbtn["text"] = ">>|*"
self.skipendalbumbtn.place(relx=1,rely=1,x=-31,y=-19)
self.skipendalbumbtn.bind("<Button-1>", self.skipendalbum)
self.skipalbumbtn = Button(self, fg="white", bg="black", font=
tkFont.Font(family="Courier", size=6, weight="bold"))
self.skipalbumbtn["text"] = ">>|"
self.skipalbumbtn.place(relx=1,rely=1,x=-77,y=-19)
self.skipalbumbtn.bind("<Button-1>", self.skipalbum)
self.deetsFrame = Frame(self, bg="black")
self.deetsFrame.pack()
self.artistlbl = Label(self.deetsFrame, fg="white", bg="black")
self.artistlbl["text"] = "Artist"
self.artistlbl.pack()
self.albumlbl = Label(self.deetsFrame, fg="white", bg="black")
self.albumlbl["text"] = "Album"
self.albumlbl.pack()
self.namelbl = Label(self.deetsFrame, fg="white", bg="black")
self.namelbl["text"] = "Name"
self.namelbl.pack()
def __init__(self, master=None):
self.iTunes = win32com.client.gencache.EnsureDispatch("
iTunes.Application")
self.iTunesEvents = win32com.client.WithEvents(self.iTunes,
iTunesEvents)
self.track = FakeTrack(track=self.iTunes.CurrentTrack) # polymorphic
- either "No Track Selected" or wrapper for actual track
self.art = self.track.Artwork(1) # either "" or actual artwork
try:
self.art.SaveArtworkToFile('C:\\Documents and
Settings\\Owner\\Desktop\\temp.jpeg')
except AttributeError:
pass
self.newart = True
self.playing = True
Frame.__init__(self, master)
self.grid()
self.createWidgets()
self.master.title("Now Playing")
self.master["bg"] = "black"
self["bg"] = "black"
self.updateInfo()
self.waitAndSee()
def updateInfo(self):
if self.iTunes.PlayerState != 0:
self.master.title("Now Playing")
if self.art and self.newart:
#print "deleting current artwork, replacing with new artwork"
self.artpic.config(width=0)
im = Image.open("C:\\Documents and
Settings\\Owner\\Desktop\\temp.jpeg")
# im.thumbnail((100,100)) #thumbnail can only decrease size;
works in-place
self.image = ImageTk.PhotoImage(im.resize((600,600)))
self.artpic["image"] = ""
self.artpic["image"] = self.image
elif not self.art:
#print "deleting current artwork"
self.image = None
self.artpic["image"] = ""
self.artpic["width"] = 75
self.artistlbl["text"] = self.track.Artist
if self.track.Album and self.track.Duration != 0:
tracks = self.iTunes.LibraryPlaylist.Search(self.track.Album,3)
tracks = sorted([tracks.Item(i) for i in
range(1,len(tracks)+1)], key=lambda x: x.TrackNumber)
tracks = [t for t in tracks if t.Album == self.track.Album]
self.trackslbl["text"] = "%02d" % (len(tracks)-[t.Name for t in
tracks].index(self.track.Name)-1)
else:
self.trackslbl["text"] = "??"
if not (self.track.Artist == "No" and self.track.Album == "Track"
and self.track.Name == "Selected"):
self.timeleftlbl["text"] = self.minutes(
self.track.Duration-self.iTunes.PlayerPosition)
else:
self.timeleftlbl["text"] = "0:00"
self.timeleftlbl.place_forget()
self.timeleftlbl.place(relx=1,rely=1,x=-(37-(10*(5-len(
self.timeleftlbl["text"]))-4*(5-len(self.timeleftlbl["text"])))),y=-37)
self.albumlbl["text"] = self.track.Album
self.namelbl["text"] = self.track.Name
self.master.update()
def minutes(self, seconds):
return "%d:%02d" % (seconds/60,seconds-(seconds/60*60))
def waitAndSee(self):
while 1:
win32gui.PumpWaitingMessages()
if self.iTunes.PlayerState == 0:
self.master.title("Paused")
self.playing = True
if (not self.iTunes.CurrentTrack) or
self.iTunes.CurrentTrack.GetITObjectIDs() != self.track.GetITObjectIDs() or
self.newart:
self.track = FakeTrack(track=self.iTunes.CurrentTrack) #
either fake track w/ "No Track Selected" or wrapper for actual
self.iTunes.CurrentTrack
self.newart = True # either empty so doesn't matter (if
self.art and self.newart in updateInfo()) or new
self.art = self.track.Artwork(1) # either "" or actual
Artwork
if self.art:
#print "saving new artwork"
self.art.SaveArtworkToFile('C:\\Documents and
Settings\\Owner\\Desktop\\temp.jpeg')
else:
self.newart = False
self.updateInfo()
time.sleep(1)
def skiptoend(self, event=None):
tm = time.localtime()
self.iTunes.CurrentTrack.PlayedDate = "%s/%s/%s %s:%s:%s" % (tm[1],
tm[2], tm[0], tm[3], tm[4], tm[5])
self.iTunes.CurrentTrack.PlayedCount += 1
self.iTunes.NextTrack()
self.newart = True
def skipendalbum(self, event):
while self.iTunes.CurrentTrack.Album == self.track.Album:
self.skiptoend()
def skipalbum(self, event):
while self.iTunes.CurrentTrack.Album == self.track.Album:
self.iTunes.NextTrack()
self.track = self.iTunes.CurrentTrack
class iTunesEvents:
def __init__(self):
print "starting iTunesEvents"
def OnPlayerPlayEvent(self, track):
print "playing"
def OnPlayerStopEvent(self, track):
print "stopped"
def OnDatabaseChangedEvent(self, deleted, changed):
print "database changed"
def OnPlayerPlayingTrackChangedEvent(self, track):
print "info on current track changed"
def OnCOMCallsDisabledEvent(self, reason):
print "com calls disabled"
def OnCOMCallsEnabledEvent(self):
print "com calls enabled"
def OnQuittingEvent(self):
print "quitting"
def OnAboutToPromptUserToQuitEvent(self):
print "prompting user to quit"
def OnSoundVolumeChangedEvent(self, newvolume):
print "volume changed"
root = Tk()
try:
app = Application(master=root)
# app.mainloop() # unnecessary b/c loop maintained in waitAndSee;
incidentally blocks events when run
root.destroy()
except TclError:
pass
try:
os.remove('C:\\Documents and Settings\\Owner\\Desktop\\temp.jpeg')
except OSError:
pass
Thanks in advance,
Orri
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/tutor/attachments/20061119/5c485861/attachment.html
More information about the Tutor
mailing list