[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