]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/MediaCtrl.py
Make the wx.MediaCtrl demo more functional, and add a sample movie.
[wxWidgets.git] / wxPython / demo / MediaCtrl.py
1
2 import wx
3 import wx.media
4 import os
5
6 from Main import opj
7
8 #----------------------------------------------------------------------
9
10 class TestPanel(wx.Panel):
11 def __init__(self, parent, log):
12 self.log = log
13 wx.Panel.__init__(self, parent, -1,
14 style=wx.TAB_TRAVERSAL|wx.CLIP_CHILDREN)
15
16 # Create some controls
17 self.mc = wx.media.MediaCtrl(self, style=wx.SIMPLE_BORDER)
18
19 btn1 = wx.Button(self, -1, "Load File")
20 self.Bind(wx.EVT_BUTTON, self.OnLoadFile, btn1)
21
22 btn2 = wx.Button(self, -1, "Play")
23 self.Bind(wx.EVT_BUTTON, self.OnPlay, btn2)
24
25 btn3 = wx.Button(self, -1, "Pause")
26 self.Bind(wx.EVT_BUTTON, self.OnPause, btn3)
27
28 btn4 = wx.Button(self, -1, "Stop")
29 self.Bind(wx.EVT_BUTTON, self.OnStop, btn4)
30
31 btn5 = wx.ToggleButton(self, -1, "Loop")
32 self.Bind(wx.EVT_TOGGLEBUTTON, self.OnLoopToggle, btn5)
33
34 slider = wx.Slider(self, -1, 0, 0, 0)
35 self.slider = slider
36 self.Bind(wx.EVT_SLIDER, self.OnSeek, slider)
37
38 self.st_size = wx.StaticText(self, -1, size=(100,-1))
39 self.st_len = wx.StaticText(self, -1, size=(100,-1))
40 self.st_pos = wx.StaticText(self, -1, size=(100,-1))
41
42
43 # setup the layout
44 sizer = wx.GridBagSizer(5,5)
45 sizer.Add(self.mc, (1,1), span=(5,1))#, flag=wx.EXPAND)
46 sizer.Add(btn1, (1,3))
47 sizer.Add(btn2, (2,3))
48 sizer.Add(btn3, (3,3))
49 sizer.Add(btn4, (4,3))
50 sizer.Add(btn5, (5,3))
51 sizer.Add(slider, (6,1), flag=wx.EXPAND)
52 sizer.Add(self.st_size, (1, 5))
53 sizer.Add(self.st_len, (2, 5))
54 sizer.Add(self.st_pos, (3, 5))
55 self.SetSizer(sizer)
56
57 self.DoLoadFile(opj("data/testmovie.mpg"))
58 self.mc.Stop()
59
60 self.timer = wx.Timer(self)
61 self.Bind(wx.EVT_TIMER, self.OnTimer)
62 self.timer.Start(100)
63
64
65
66 def OnLoadFile(self, evt):
67 dlg = wx.FileDialog(self, message="Choose a media file",
68 defaultDir=os.getcwd(), defaultFile="",
69 style=wx.OPEN | wx.CHANGE_DIR )
70 if dlg.ShowModal() == wx.ID_OK:
71 path = dlg.GetPath()
72 self.DoLoadFile(path)
73 dlg.Destroy()
74
75
76 def DoLoadFile(self, path):
77 if not self.mc.Load(path):
78 wx.MessageBox("Unable to load %s: Unsupported format?" % path,
79 "ERROR",
80 wx.ICON_ERROR | wx.OK)
81 else:
82 self.mc.SetBestFittingSize()
83 self.GetSizer().Layout()
84 self.slider.SetRange(0, self.mc.Length())
85 self.mc.Play()
86
87
88 def OnLoopToggle(self, evt):
89 btn = evt.GetEventObject()
90 self.mc.Loop(btn.GetValue())
91
92
93 def OnPlay(self, evt):
94 self.mc.Play()
95
96 def OnPause(self, evt):
97 self.mc.Pause()
98
99 def OnStop(self, evt):
100 self.mc.Stop()
101
102
103 def OnSeek(self, evt):
104 offset = self.slider.GetValue()
105 self.mc.Seek(offset)
106
107 def OnTimer(self, evt):
108 offset = self.mc.Tell()
109 self.slider.SetValue(offset)
110 self.st_size.SetLabel('size: %s' % self.mc.GetBestSize())
111 self.st_len.SetLabel('length: %d seconds' % (self.mc.Length()/1000))
112 self.st_pos.SetLabel('position: %d' % offset)
113
114
115 #----------------------------------------------------------------------
116
117 def runTest(frame, nb, log):
118 try:
119 win = TestPanel(nb, log)
120 return win
121 except NotImplementedError:
122 from Main import MessagePanel
123 win = MessagePanel(nb, 'wx.MediaCtrl is not available on this platform.',
124 'Sorry', wx.ICON_WARNING)
125 return win
126
127
128 #----------------------------------------------------------------------
129
130
131
132 overview = """<html><body>
133 <h2><center>wx.MediaCtrl</center></h2>
134
135 wx.MediaCtrl is a class that allows a way to convieniently display
136 various types of media, such as videos, audio files, natively through
137 native codecs. Several different formats of audio and video files are
138 supported, but some formats may not be playable on all platforms or
139 may require specific codecs to be installed.
140
141 <p>
142 wx.MediaCtrl uses native backends to render media, for example on Windows
143 there is a ActiveMovie/DirectShow backend, and on Macintosh there is a
144 QuickTime backend.
145 <p>
146 wx.MediaCtrl is not currently available on unix systems.
147
148 </body></html>
149 """
150
151
152
153 if __name__ == '__main__':
154 import sys,os
155 import run
156 run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
157