self.label = self.wTree.get_widget('audio_label')
self.bbox = self.wTree.get_widget('audio_buttons')
self.status = self.wTree.get_widget('audio_status')
+ self.markers = self.wTree.get_widget('audio_markers')
super(audioplayer, self).__init__()
+ videosink = gst.element_factory_make('fakesink')
+ self.playbin.set_property('video-sink', videosink)
--- /dev/null
+#!/usr/bin/env python
+# vim: ts=4:sw=4:tw=78:nowrap
+""" Demonstration using editable and activatable CellRenderers """
+import pygtk
+pygtk.require("2.0")
+import gtk, gobject
+
+tasks = {
+ "Buy groceries": "Go to Asda after work",
+ "Do some programming": "Remember to update your software",
+ "Power up systems": "Turn on the client but leave the server",
+ "Watch some tv": "Remember to catch ER"
+ }
+
+class GUI_Controller:
+ """ The GUI class is the controller for our application """
+ def __init__(self):
+ # setup the main window
+ self.root = gtk.Window(type=gtk.WINDOW_TOPLEVEL)
+ self.root.set_title("CellRenderer Example")
+ self.root.connect("destroy", self.destroy_cb)
+ # Get the model and attach it to the view
+ self.mdl = Store.get_model()
+ self.view = Display.make_view( self.mdl )
+ # Add our view into the main window
+ self.root.add(self.view)
+ self.root.show_all()
+ return
+ def destroy_cb(self, *kw):
+ """ Destroy callback to shutdown the app """
+ gtk.main_quit()
+ return
+ def run(self):
+ """ run is called to set off the GTK mainloop """
+ gtk.main()
+ return
+
+class InfoModel:
+ """ The model class holds the information we want to display """
+ def __init__(self):
+ """ Sets up and populates our gtk.TreeStore """
+ self.tree_store = gtk.TreeStore( gobject.TYPE_STRING,
+ gobject.TYPE_BOOLEAN )
+ # places the global people data into the list
+ # we form a simple tree.
+ for item in tasks.keys():
+ parent = self.tree_store.append( None, (item, None) )
+ self.tree_store.append( parent, (tasks[item],None) )
+ return
+ def get_model(self):
+ """ Returns the model """
+ if self.tree_store:
+ return self.tree_store
+ else:
+ return None
+
+class DisplayModel:
+ """ Displays the Info_Model model in a view """
+ def make_view( self, model ):
+ """ Form a view for the Tree Model """
+ self.view = gtk.TreeView( model )
+ # setup the text cell renderer and allows these
+ # cells to be edited.
+ self.renderer = gtk.CellRendererText()
+ self.renderer.set_property( 'editable', True )
+ self.renderer.connect( 'edited', self.col0_edited_cb, model )
+
+ # The toggle cellrenderer is setup and we allow it to be
+ # changed (toggled) by the user.
+ self.renderer1 = gtk.CellRendererToggle()
+ self.renderer1.set_property('activatable', True)
+ self.renderer1.connect( 'toggled', self.col1_toggled_cb, model )
+
+ # Connect column0 of the display with column 0 in our list model
+ # The renderer will then display whatever is in column 0 of
+ # our model .
+ self.column0 = gtk.TreeViewColumn("Name", self.renderer, text=0)
+
+ # The columns active state is attached to the second column
+ # in the model. So when the model says True then the button
+ # will show as active e.g on.
+ self.column1 = gtk.TreeViewColumn("Complete", self.renderer1 )
+ self.column1.add_attribute( self.renderer1, "active", 1)
+ self.view.append_column( self.column0 )
+ self.view.append_column( self.column1 )
+ return self.view
+ def col0_edited_cb( self, cell, path, new_text, model ):
+ """
+ Called when a text cell is edited. It puts the new text
+ in the model so that it is displayed properly.
+ """
+ print "Change '%s' to '%s'" % (model[path][0], new_text)
+ model[path][0] = new_text
+ return
+ def col1_toggled_cb( self, cell, path, model ):
+ """
+ Sets the toggled state on the toggle button to true or false.
+ """
+ model[path][1] = not model[path][1]
+ print "Toggle '%s' to: %s" % (model[path][0], model[path][1],)
+ return
+
+if __name__ == '__main__':
+ Store = InfoModel()
+ Display = DisplayModel()
+ myGUI = GUI_Controller()
+ myGUI.run()
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
- <widget class="GtkVBox" id="vbox2">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="resize">False</property>
- <property name="shrink">True</property>
- </packing>
+ <placeholder/>
</child>
<child>
<widget class="GtkVBox" id="av_boxes">
<widget class="GtkHScale" id="video_seeker">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="draw_value">False</property>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="ideo_status">
+ <widget class="GtkHBox" id="video_markers">
<property name="visible">True</property>
- <property name="label" translatable="yes">label</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
+ <child>
+ <widget class="GtkLabel" id="video_status">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">label</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="position">0</property>
<widget class="GtkHScale" id="audio_seeker">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="draw_value">False</property>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
+ <widget class="GtkHBox" id="audio_markers">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
<widget class="GtkLabel" id="audio_status">
<property name="visible">True</property>
<property name="label" translatable="yes">label</property>
</widget>
<packing>
<property name="expand">False</property>
- <property name="position">2</property>
+ <property name="position">3</property>
</packing>
</child>
</widget>
import pygtk
import gtk
import gtk.glade
+import time
class mediaplayer(object):
PLAY_IMAGE = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)
self.spinner.set_range(0, 100)
self.spinner.set_increments(1, 10)
self.spinner.connect('value-changed', self.on_spinner_change)
+ self.spinner.connect('output', self.on_spinner_output)
self.seeker.set_range(0, 100)
self.seeker.set_increments(1, 10)
self.seeker.connect('button-press-event', self.on_button_press)
self.seeker.connect('button-release-event', self.on_button_release)
+ label = gtk.Label()
+ label.set_text('Begin:')
+ self.markers.pack_start(label, True)
+
+ self.begin = gtk.SpinButton()
+ self.begin.connect('output', self.on_spinner_output)
+ self.markers.pack_start(self.begin, True)
+
+ label = gtk.Label()
+ label.set_text('End:')
+ self.markers.pack_start(label, True)
+
+ self.end = gtk.SpinButton()
+ self.end.connect('output', self.on_spinner_output)
+ self.markers.pack_start(self.end, True)
+
+ label = gtk.Label()
+ label.set_text('Length:')
+ self.markers.pack_start(label, True)
+
+ self.length = gtk.SpinButton()
+ self.length.connect('output', self.on_spinner_output)
+ self.markers.pack_start(self.length, True)
+
+ self.markers.show_all()
+
self.play_button = gtk.Button()
+ self.image_play = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)
+ self.image_pause = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_BUTTON)
self.play_button.set_image(self.PLAY_IMAGE)
self.play_button.connect('clicked', self.on_play_clicked)
self.bbox.pack_start(self.play_button, False)
self.begin_button = gtk.Button()
- self.begin_button.set_image(self.PLAY_IMAGE)
+ self.begin_button.set_image(gtk.image_new_from_stock(gtk.STOCK_GOTO_FIRST, gtk.ICON_SIZE_BUTTON))
self.begin_button.connect('clicked', self.on_begin_clicked)
self.bbox.pack_start(self.begin_button, False)
self.end_button = gtk.Button()
- self.end_button.set_image(self.PLAY_IMAGE)
+ self.end_button.set_image(gtk.image_new_from_stock(gtk.STOCK_GOTO_LAST, gtk.ICON_SIZE_BUTTON))
self.end_button.connect('clicked', self.on_end_clicked)
self.bbox.pack_start(self.end_button, False)
self.is_loaded = False
self.is_playing = False
self.known_range = False
+ self.lock_slider = 0
def play(self, uri):
self.playbin.set_property('uri', uri)
self.playbin.set_state(gst.STATE_PLAYING)
self.label.label = 'f';
- gobject.timeout_add(500, self.update_slider)
+ gobject.timeout_add(50, self.update_slider)
self.is_playing = True
self.is_loaded = True
self.known_range = False
def on_video_realized(self, sender):
self.sink.set_xwindow_id(self.drawingarea.window.xid)
+ def get_pos(self):
+ nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME)
+ return float(nanosecs) / gst.SECOND;
+
def update_slider(self):
if not self.is_playing:
return True
+ if self.lock_slider > time.time():
+ return True
try:
if not self.known_range:
print duration_secs
self.seeker.set_range(0, duration_secs)
self.spinner.set_range(0, duration_secs)
+ self.begin.set_range(0, duration_secs)
+ self.end.set_range(0, duration_secs)
+ self.length.set_range(0, duration_secs)
self.known_range = True
print "Duration: %f" % (duration_secs)
- nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME)
+ value = self.get_pos()
+ self.set_value(value)
- # block seek handler so we don't seek when we set_value()
- self.seeker.handler_block_by_func(self.on_seeker_change)
- self.spinner.handler_block_by_func(self.on_spinner_change)
+ except gst.QueryError:
+ # pipeline must not be ready and does not know position
+ pass
- value = float(nanosecs) / gst.SECOND;
+ return True # continue calling every 30 milliseconds
- #print "Trigger: %f" % (value)
+ def set_value(self, value):
+ # block seek handler so we don't seek when we set_value()
+ self.seeker.handler_block_by_func(self.on_seeker_change)
+ self.spinner.handler_block_by_func(self.on_spinner_change)
- self.seeker.set_value(value)
- self.spinner.set_text("%f" %(value))
+ #print "Trigger: %f" % (value)
- self.seeker.handler_unblock_by_func(self.on_seeker_change)
- self.spinner.handler_unblock_by_func(self.on_spinner_change)
+ self.seeker.set_value(value)
+ self.spinner.set_value(value)
- except gst.QueryError:
- # pipeline must not be ready and does not know position
- pass
+ self.seeker.handler_unblock_by_func(self.on_seeker_change)
+ self.spinner.handler_unblock_by_func(self.on_spinner_change)
- return True # continue calling every 30 milliseconds
+ def formatSecondsToMencoder(self, s):
+ ds = s % 1
+ ws = s - ds
+ ds *= 1000
+ s = ws % 60
+ ws -= s
+ m = ws % 3600 / 60
+ ws -= ws % 3600
+ h = ws / 3600
+ return "%02d:%02d:%02d.%03d" % (h, m, s, ds)
+ def on_spinner_change(self, element):
+ seek_time_secs = element.get_value()
+ self.mseek(seek_time_secs)
def on_seeker_change(self, element, a, b):
seek_time_secs = element.get_value()
self.mseek(seek_time_secs)
- def on_spinner_change(self, element):
- seek_time_secs = float(element.get_value())
- self.mseek(seek_time_secs)
+ def on_spinner_output(self, element):
+ element.set_text(self.formatSecondsToMencoder(element.get_value()))
+ return True
def mplay(self):
self.playbin.set_state(gst.STATE_PLAYING)
+ self.mseek(self.get_pos())
def mpause(self):
self.playbin.set_state(gst.STATE_PAUSED)
def mseek(self, seek_time_secs):
- print 'seek: %f' % (seek_time_secs)
+ #print 'seek: %f' % (seek_time_secs)
+ self.set_value(seek_time_secs)
+ self.lock_slider = time.time() + 0.1;
self.playbin.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT, seek_time_secs * gst.SECOND)
def on_button_press(self, element, a):
self.is_playing = True;
def on_begin_clicked(self, element):
+ pos = self.get_pos()
+ print 'Begin clicked: %f' % (pos)
+ self.begin.set_value(pos)
+ self.update_length()
def on_end_clicked(self, element):
+ pos = self.get_pos()
+ print 'End clicked: %f' % (pos)
+ self.end.set_value(pos)
+ self.update_length()
+
+ def update_length(self):
+ self.length.set_value(self.end.get_value() - self.begin.get_value())
import sys
from videoplayer import videoplayer
from audioplayer import audioplayer
+from tree import tree
+
try:
import pygtk
pygtk.require("2.0")
self.video = videoplayer(self)
self.video.play('file:///mnt/dl/dkuug/video/osd10/dan/dan.dv')
+ self.tree = tree()
+ self.wTree.get_widget('hpaned6').add(self.tree.get_tree())
+
print self.wTree.get_widget('dMain').show()
+
self.wTree.visible = True
gtk.main()
sys.exit(0)
if __name__ == "__main__":
+ try:
TalkCutter()
+ except KeyboardInterrupt:
+ print ''
+ except SystemExit:
+ pass
self.bbox = self.wTree.get_widget('video_buttons')
self.status = self.wTree.get_widget('video_status')
self.drawingarea = self.wTree.get_widget('video')
+ self.markers = self.wTree.get_widget('video_markers')
super(videoplayer, self).__init__()