Hi everyone,
My MediaCtrl won't load a file on Linux unless I load it twice (or
uncomment the code in "do_load_file":
#!/usr/bin/python
import wx
import wx.media
class MediaPanel(wx.Frame):
"""
A panel that contains a MediaCtrl for playing videos/audio, and
buttons for
controlling it: open (file)/pause/stop/play, and a slider bar.
"""
def __init__(self):
wx.Frame.__init__(self, None)
self.mc = wx.media.MediaCtrl(self, style=wx.SIMPLE_BORDER)
self.open = wx.Button(self, label="open")
self.play = wx.Button(self, label="play")
self.pause = wx.Button(self, label="pause")
self.stop = wx.Button(self, label="stop")
self.slider = wx.Slider(self)
self.slider.SetMinSize((150, -1))
sizer = wx.GridBagSizer(5, 5)
sizer.Add(self.mc, (1, 1), span=(5, 1))
sizer.Add(self.open, (1, 3), flag=wx.RIGHT, border=10)
sizer.Add(self.play, (2, 3), flag=wx.RIGHT, border=10)
sizer.Add(self.pause, (3, 3), flag=wx.RIGHT, border=10)
sizer.Add(self.stop, (4, 3), flag=wx.RIGHT, border=10)
sizer.Add(self.slider, (6, 1), flag=wx.EXPAND)
self.SetSizer(sizer)
self.Layout()
self.Fit()
self.Bind(wx.media.EVT_MEDIA_LOADED, self.media_loaded)
self.Bind(wx.media.EVT_MEDIA_STOP, self.media_stopped)
self.Bind(wx.EVT_BUTTON, self.load_file, self.open)
self.Bind(wx.EVT_BUTTON, self.on_play, self.play)
self.Bind(wx.EVT_BUTTON, self.on_pause, self.pause)
self.Bind(wx.EVT_BUTTON, self.on_stop, self.stop)
self.Bind(wx.EVT_SLIDER, self.on_seek, self.slider)
def load_file(self, evt):
vids = "*.avi; *.mkv; *.mov; *.mpg; *ogg; *.wmv"
audio = "*.mp3; *.oga; *.ogg; *.wav"
wc = "Media Files"+" |%s;%s|" % (vids, audio)
wc += "Video Files"+" (%s)|%s|" % (vids, vids)
wc += "Audio Files"+" (%s)|%s" % (audio, audio)
dlg = wx.FileDialog(self, message="Choose a media file",
wildcard=wc, style=wx.OPEN | wx.CHANGE_DIR )
if dlg.ShowModal() == wx.ID_OK:
self.do_load_file(dlg.GetPath())
dlg.Destroy()
def do_load_file(self, path):
if not self.mc.Load(path):
wx.MessageBox("Unable to load %s: Unsupported format?" % path,
"Error", wx.ICON_ERROR | wx.OK)
#else:
# self.mc.Load(path)
def media_loaded(self, evt):
self.mc.SetInitialSize()
self.slider.SetRange(0, self.mc.Length())
self.GetSizer().Layout()
self.Fit()
def media_stopped(self, evt):
self.on_stop(None, True)
def on_play(self, evt):
if not self.mc.Play():
wx.MessageBox("Unable to Play media : Unsupported format?",
"Error", wx.ICON_ERROR | wx.OK)
def on_pause(self, evt):
self.mc.Pause()
def on_stop(self, evt, ignore=False):
if not ignore:
self.mc.Stop()
self.slider.SetValue(0)
def on_seek(self, evt):
self.mc.Seek(self.slider.GetValue())
app = wx.App(False)
f = MediaPanel()
f.Show()
app.MainLoop()
The code is based upon my program's MediaPanel, which I've stripped down
to its bare essentials above (removing volume, button enable/disable
etc)...which was based upon the demo code. The demo code does not have
this issue.
Sometimes the file will load, because my calls to
self.mc.SetInitialSize() and self.Layout() will change the size of the
Frame, but pressing play does nothing. A solution seems to be to Load()
the media file twice, but I'm not sure of the internet details of it,
and how much more memory that uses etc.
Any ideas would be much appreciated. Thanks!