[vlc-commits] commit: python-vlc: WX-based example (Olivier Aubert )
git at videolan.org
git at videolan.org
Tue Dec 7 21:41:51 CET 2010
vlc/python | branch: master | Olivier Aubert <olivier.aubert at liris.cnrs.fr> | Tue Dec 7 11:08:22 2010 +0100| [d869e26b5764a01f7b5406c04e6267cd39c81525] | committer: Olivier Aubert
python-vlc: WX-based example
Contribution of Michele Orr'u for the Google Code-In
> http://git.videolan.org/gitweb.cgi/vlc/python.git/?a=commit;h=d869e26b5764a01f7b5406c04e6267cd39c81525
---
examples/wxvlc.py | 225 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 225 insertions(+), 0 deletions(-)
diff --git a/examples/wxvlc.py b/examples/wxvlc.py
new file mode 100755
index 0000000..9a29031
--- /dev/null
+++ b/examples/wxvlc.py
@@ -0,0 +1,225 @@
+#! /usr/bin/python
+# -*- coding: utf-8 -*-
+
+#
+# WX example for VLC Python bindings
+# Copyright (C) 2009-2010 the VideoLAN team
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+#
+"""
+A simple example for VLC python bindings using wxPython.
+
+Author: Michele Orrù
+Date: 23-11-2010
+"""
+
+# import external libraries
+import wx # 2.8
+import vlc
+
+# import standard libraries
+import os
+import user
+
+class Player(wx.Frame):
+ """The main window has to deal with events.
+ """
+ def __init__(self, title):
+ wx.Frame.__init__(self, None, -1, title,
+ pos=wx.DefaultPosition, size=(550, 500))
+
+ # Menu Bar
+ # File Menu
+ self.frame_menubar = wx.MenuBar()
+ self.file_menu = wx.Menu()
+ self.file_menu.Append(1, "&Open", "Open from file..")
+ self.file_menu.AppendSeparator()
+ self.file_menu.Append(2, "&Close", "Quit")
+ self.Bind(wx.EVT_MENU, self.OnOpen, id=1)
+ self.Bind(wx.EVT_MENU, self.OnExit, id=2)
+ self.frame_menubar.Append(self.file_menu, "File")
+ self.SetMenuBar(self.frame_menubar)
+
+ # Panels
+ # The first panel holds the video and it's all black
+ self.videopanel = wx.Panel(self, -1)
+ self.videopanel.SetBackgroundColour(wx.BLACK)
+
+ # The second panel holds controls
+ ctrlpanel = wx.Panel(self, -1 )
+ self.timeslider = wx.Slider(ctrlpanel, -1, 0, 0, 1000)
+ self.timeslider.SetRange(0, 1000)
+ pause = wx.Button(ctrlpanel, label="Pause")
+ play = wx.Button(ctrlpanel, label="Play")
+ stop = wx.Button(ctrlpanel, label="Stop")
+ volume = wx.Button(ctrlpanel, label="Volume")
+ self.volslider = wx.Slider(ctrlpanel, -1, 0, 0, 100, size=(100, -1))
+
+ # Bind controls to events
+ self.Bind(wx.EVT_BUTTON, self.OnPlay, play)
+ self.Bind(wx.EVT_BUTTON, self.OnPause, pause)
+ self.Bind(wx.EVT_BUTTON, self.OnStop, stop)
+ self.Bind(wx.EVT_BUTTON, self.OnToggleVolume, volume)
+ self.Bind(wx.EVT_SLIDER, self.OnSetVolume, self.volslider)
+
+ # Give a pretty layout to the controls
+ ctrlbox = wx.BoxSizer(wx.VERTICAL)
+ box1 = wx.BoxSizer(wx.HORIZONTAL)
+ box2 = wx.BoxSizer(wx.HORIZONTAL)
+ # box1 contains the timeslider
+ box1.Add(self.timeslider, 1)
+ # box2 contains some buttons and the volume controls
+ box2.Add(play, flag=wx.RIGHT, border=5)
+ box2.Add(pause)
+ box2.Add(stop)
+ box2.Add((-1, -1), 1)
+ box2.Add(volume)
+ box2.Add(self.volslider, flag=wx.TOP | wx.LEFT, border=5)
+ # Merge box1 and box2 to the ctrlsizer
+ ctrlbox.Add(box1, flag=wx.EXPAND | wx.BOTTOM, border=10)
+ ctrlbox.Add(box2, 1, wx.EXPAND)
+ ctrlpanel.SetSizer(ctrlbox)
+ # Put everything togheter
+ sizer = wx.BoxSizer(wx.VERTICAL)
+ sizer.Add(self.videopanel, 1, flag=wx.EXPAND)
+ sizer.Add(ctrlpanel, flag=wx.EXPAND | wx.BOTTOM | wx.TOP, border=10)
+ self.SetSizer(sizer)
+ self.SetMinSize((350, 300))
+
+ # finally create the timer, which updates the timeslider
+ self.timer = wx.Timer(self)
+ self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
+
+ # VLC player controls
+ self.Instance = vlc.Instance()
+ self.player = self.Instance.media_player_new()
+
+ def OnExit(self, evt):
+ """Closes the window.
+ """
+ self.Close()
+
+ def OnOpen(self, evt):
+ """Pop up a new dialow window to choose a file, then play the selected file.
+ """
+ # if a file is already running, then stop it.
+ self.OnStop(None)
+
+ # Create a file dialog opened in the current home directory, where
+ # you can display all kind of files, having as title "Choose a file".
+ dlg = wx.FileDialog(self, "Choose a file", user.home, "",
+ "*.*", wx.OPEN)
+ if dlg.ShowModal() == wx.ID_OK:
+ dirname = dlg.GetDirectory()
+ filename = dlg.GetFilename()
+ # Creation
+ self.Media = self.Instance.media_new(unicode(os.path.join(dirname, filename)))
+ self.player.set_media(self.Media)
+ # Report the title of the file chosen
+ title = self.player.get_title()
+ # if an error was encountred while retriving the title, then use
+ # filename
+ if title == -1:
+ title = filename
+ self.SetTitle("%s - wxVLCplayer" % title)
+
+ # set the window id where to render VLC's video output
+ self.player.set_xwindow(self.videopanel.GetHandle())
+ # FIXME: this should be made cross-platform
+ self.OnPlay(None)
+
+ # set the volume slider to the current volume
+ self.volslider.SetValue(self.player.audio_get_volume() / 2)
+
+ # finally destroy the dialog
+ dlg.Destroy()
+
+ def OnPlay(self, evt):
+ """Toggle the status to Play/Pause.
+
+ If no file is loaded, open the dialog window.
+ """
+ # check if there is a file to play, otherwise open a
+ # wx.FileDialog to select a file
+ if not self.player.get_media():
+ self.OnOpen(None)
+ else:
+ # Try to launch the media, if this fails display an error message
+ if self.player.play() == -1:
+ self.errorDialog("Unable to play.")
+ else:
+ self.timer.Start()
+
+ def OnPause(self, evt):
+ """Pause the player.
+ """
+ self.player.pause()
+
+ def OnStop(self, evt):
+ """Stop the player.
+ """
+ self.player.stop()
+ # reset the time slider
+ self.timeslider.SetValue(0)
+ self.timer.Stop()
+
+ def OnTimer(self, evt):
+ """Update the time slider according to the current movie time.
+ """
+ # since the self.player.get_length can change while playing,
+ # re-set the timeslider to the correct range.
+ length = self.player.get_length()
+ self.timeslider.SetRange(-1, length)
+
+ # update the time on the slider
+ time = self.player.get_time()
+ self.timeslider.SetValue(time)
+
+ def OnToggleVolume(self, evt):
+ """Mute/Unmute according to the audio button.
+ """
+ is_mute = self.player.audio_get_mute()
+
+ self.player.audio_set_mute(not is_mute)
+ # update the volume slider;
+ # since vlc volume range is in [0, 200],
+ # and our volume slider has range [0, 100], just divide by 2.
+ self.volslider.SetValue(self.player.audio_get_volume() / 2)
+
+ def OnSetVolume(self, evt):
+ """Set the volume according to the volume sider.
+ """
+ volume = self.volslider.GetValue() * 2
+ # vlc.MediaPlayer.audio_set_volume returns 0 if success, -1 otherwise
+ if self.player.audio_set_volume(volume) == -1:
+ self.errorDialog("Failed to set volume")
+
+ def errorDialog(self, errormessage):
+ """Display a simple error dialog.
+ """
+ edialog = wx.MessageDialog(self, errormessage, 'Error', wx.OK|
+ wx.ICON_ERROR)
+ edialog.ShowModal()
+
+if __name__ == "__main__":
+ # Create a wx.App(), which handles the windowing system event loop
+ app = wx.PySimpleApp()
+ # Create the window containing our small media player
+ player = Player("Simple PyVLC Player")
+ # show the player window centred and run the application
+ player.Centre()
+ player.Show()
+ app.MainLoop()
More information about the vlc-commits
mailing list