[vlc-devel] commit: python-ctypes: provide a helper pygtk VLCWidget which also serves as example player app. (Olivier Aubert )
git version control
git at videolan.org
Fri Sep 4 16:32:44 CEST 2009
vlc | branch: master | Olivier Aubert <olivier.aubert at liris.cnrs.fr> | Fri Sep 4 16:31:50 2009 +0200| [bb7e54f6c58eaf1a9ad3427adbdee288ab3f2bed] | committer: Olivier Aubert
python-ctypes: provide a helper pygtk VLCWidget which also serves as example player app.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bb7e54f6c58eaf1a9ad3427adbdee288ab3f2bed
---
bindings/python-ctypes/vlcwidget.py | 154 +++++++++++++++++++++++++++++++++++
1 files changed, 154 insertions(+), 0 deletions(-)
diff --git a/bindings/python-ctypes/vlcwidget.py b/bindings/python-ctypes/vlcwidget.py
new file mode 100755
index 0000000..2c607c5
--- /dev/null
+++ b/bindings/python-ctypes/vlcwidget.py
@@ -0,0 +1,154 @@
+#! /usr/bin/python
+
+"""VLC Widget classes.
+
+This module provides two helper classes, to ease the embedding of a
+VLC component inside a pygtk application.
+
+VLCWidget is a simple VLC widget.
+
+DecoratedVLCWidget provides simple player controls.
+
+$Id$
+"""
+
+import gtk
+import sys
+import vlc
+
+from gettext import gettext as _
+
+# Create a single vlc.Instance() to be share by (possible) multiple players.
+instance=vlc.Instance()
+
+class VLCWidget(gtk.DrawingArea):
+ """Simple VLC widget.
+
+ Its player can be controlled through the 'player' attribute, which
+ is a vlc.MediaPlayer() instance.
+ """
+ def __init__(self, *p):
+ gtk.DrawingArea.__init__(self)
+ self.player=instance.media_player_new()
+ def handle_embed(*args):
+ if sys.platform == 'win32':
+ self.player.set_hwnd(self.window.handle)
+ else:
+ self.player.set_xwindow(self.window.xid)
+ return True
+ self.connect("map-event", handle_embed)
+ self.set_size_request(320, 200)
+
+class DecoratedVLCWidget(gtk.VBox):
+ """Decorated VLC widget.
+
+ VLC widget decorated with a player control toolbar.
+
+ Its player can be controlled through the 'player' attribute, which
+ is a MediaControl instance.
+ """
+ def __init__(self, *p):
+ gtk.VBox.__init__(self)
+ self._vlc_widget=VLCWidget(*p)
+ self.player=self._vlc_widget.player
+ self.pack_start(self._vlc_widget, expand=True)
+ self._toolbar = self.get_player_control_toolbar()
+ self.pack_start(self._toolbar, expand=False)
+
+ def get_player_control_toolbar(self):
+ """Return a player control toolbar
+ """
+ tb=gtk.Toolbar()
+ tb.set_style(gtk.TOOLBAR_ICONS)
+
+ tb_list = (
+ (_("Play"), _("Play"), gtk.STOCK_MEDIA_PLAY, lambda b: self.player.play()),
+ (_("Pause"), _("Pause"), gtk.STOCK_MEDIA_PAUSE, lambda b: self.player.pause()),
+ (_("Stop"), _("Stop"), gtk.STOCK_MEDIA_STOP, lambda b: self.player.stop()),
+ (_("Quit"), _("Quit"), gtk.STOCK_QUIT, lambda b: gtk.main_quit()),
+ )
+
+ for text, tooltip, stock, callback in tb_list:
+ b=gtk.ToolButton(stock)
+ b.connect("clicked", callback)
+ tb.insert(b, -1)
+ tb.show_all()
+ return tb
+
+class VideoPlayer:
+ """Example simple video player.
+ """
+ def __init__(self):
+ self.vlc = DecoratedVLCWidget()
+
+ def main(self, fname):
+ self.vlc.player.set_media(instance.media_new(fname))
+ self.popup()
+ gtk.main()
+
+ def popup(self):
+ w=gtk.Window()
+ w.add(self.vlc)
+ w.show_all()
+ w.connect("destroy", gtk.main_quit)
+ return w
+
+class MultiVideoPlayer:
+ """Example multi-video player.
+
+ It plays multiple files side-by-side, with per-view and global controls.
+ """
+ def main(self, filenames):
+ # Build main window
+ window=gtk.Window()
+ mainbox=gtk.VBox()
+ videos=gtk.HBox()
+
+ window.add(mainbox)
+ mainbox.add(videos)
+
+ # Create VLC widgets
+ for fname in filenames:
+ v=DecoratedVLCWidget()
+ v.player.set_media(instance.media_new(fname))
+ videos.add(v)
+
+ # Create global toolbar
+ tb=gtk.Toolbar()
+ tb.set_style(gtk.TOOLBAR_ICONS)
+
+ def execute(b, methodname):
+ """Execute the given method on all VLC widgets.
+ """
+ for v in videos.get_children():
+ getattr(v.player, methodname)()
+ return True
+
+ for text, tooltip, stock, callback, arg in (
+ (_("Play"), _("Play"), gtk.STOCK_MEDIA_PLAY, execute, "play"),
+ (_("Pause"), _("Pause"), gtk.STOCK_MEDIA_PAUSE, execute, "pause"),
+ (_("Stop"), _("Stop"), gtk.STOCK_MEDIA_STOP, execute, "stop"),
+ (_("Quit"), _("Quit"), gtk.STOCK_QUIT, lambda b, d: gtk.main_quit(), None),
+ ):
+ b=gtk.ToolButton(stock)
+ b.connect("clicked", callback, arg)
+ tb.insert(b, -1)
+
+ mainbox.pack_start(tb, expand=False)
+
+ window.show_all()
+ window.connect("destroy", gtk.main_quit)
+ gtk.main()
+
+if __name__ == '__main__':
+ if not sys.argv[1:]:
+ print "You must provide at least 1 movie filename"
+ sys.exit(1)
+ if len(sys.argv[1:]) == 1:
+ # Only 1 file. Simple interface
+ p=VideoPlayer()
+ p.main(sys.argv[1])
+ else:
+ # Multiple files.
+ p=MultiVideoPlayer()
+ p.main(sys.argv[1:])
More information about the vlc-devel
mailing list