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