Hier jetzt ein kleines Script, welches die Problematik verdeutlicht. Wird nach 5 Sekunden per FutureCall ein Stop erzwungen, wird dieser Status korrekt erkannt und der Timer gestoppt. Stoppt dagegen w.MediaCtrl von sich aus, wird kein wx.media.EVT_MEDIA_STOP ausgelöst und in self.OnTimer() eine Fehlermeldung generiert, da self.mc.GetState() keinen Wert liefert (self.mc.Tell() dagegen schon !?).
wx.media.EVT_MEDIA_STOP wird ausgelöst, wenn das Ende des Mediastreams erreicht ist. Da aber kein wx.media.EVT_MEDIA_STOP ausgelöst wird, ist das Ende des Streams offensichtlich noch nicht erreicht. Weshalb stoppt Quicktime aber dann??
Code: Alles auswählen
#!/usr/bin/env python
import wx, wx.media
class Player(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, size=(280, 120))
panel = wx.Panel(self, -1)
self.status = wx.StaticText(self, -1, pos=(80,10))
self.filelength = wx.StaticText(self, -1, pos=(80,30))
self.playposition = wx.StaticText(self, -1, pos=(80,50))
self.info = wx.StaticText(self, -1, pos=(80,70))
# init wx.MediaCtrl
try:
self.mc = wx.media.MediaCtrl(self, style=wx.SIMPLE_BORDER, szBackend=wx.media.MEDIABACKEND_QUICKTIME)
except NotImplementedError:
self.Destroy()
self.Bind(wx.media.EVT_MEDIA_LOADED, self.playfile)
self.Bind(wx.media.EVT_MEDIA_STOP, self.OnStop)
# init Timer
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer)
st = self.mc.GetState()
if st == 0: status = 'stop'
elif st == 2: status = 'play'
self.status.SetLabel('Status: '+status)
# load song from url
#wx.FutureCall(1000, self.mc.LoadURI,'http://cache03-music01.myspacecdn.com/20/std_5c415144919fce1feb54d8c9a6529398.mp3')
wx.FutureCall(1000, self.mc.LoadURI,'http://cache03-music02.myspacecdn.com/97/std_f5f7a726d2a44b6681c13d0a73944c90.mp3')
#wx.FutureCall(1000, self.mc.LoadURI,'http://cache03-music02.myspacecdn.com/122/std_5dafc4d577064172bcc9d61b1d25610e.mp3')
# trigger stop
#wx.FutureCall(20000,self.stop)
self.Center()
def OnTimer(self, evt):
st = self.mc.GetState()
offset = self.mc.Tell()
inf = float(self.mc.Length()) / float(offset)
if st == 0: status = 'stop'
elif st == 2: status = 'play'
self.status.SetLabel('Status: '+status)
self.playposition.SetLabel('Playposition: %d' % offset)
self.info.SetLabel('Len / Pos.: %.2f'% inf)
def playfile(self, event=None):
self.filelength.SetLabel('Filelength: '+str(self.mc.Length()))
self.timer.Start(500)
self.mc.Play()
def stop(self):
self.mc.Stop()
def OnStop(self, event=None):
self.timer.Stop()
self.status.SetLabel('Status: stop')
class Test(wx.App):
def OnInit(self):
frame = Player()
frame.Show(True)
self.SetTopWindow(frame)
return True
app = Test(0)
app.MainLoop()
Gruss, Seven