I find out just one pratical sample about how to use pygtk with thread at the http://pygtk.org/ faq. Although I think that coolest thing of pygtk is use with glade. With no samples available I’d tried to do by myself. I am glad because at the end it was pretty much the same stuff as the sample that wasn’t using glade! Good job done, folks!
#!/usr/bin/env python # gui.py, sample of PyGTK + GLADE + Threads use. # Licence: GPLv2.0 try: import pygtk pygtk.require("2.0") except: print "You need to install pyGTK or GTKv2 or set PYTHONPATH." sys.exit(1) import sys import gtk import gtk.glade import gobject import threading import time class Engine: def __init__(self): self.init_app() def init_app(self): print "Engine Start!" time.sleep(2) print "Engine End!" return gobject.threads_init() class AppGui(threading.Thread): def __init__(self): super(AppGui, self).__init__() self.init_app() def init_app(self): self.gladefile = "gui.glade" self.wTree = gtk.glade.XML(self.gladefile) dic = { "on_button1_clicked" : self.run, "on_MainWindow_destroy" : gtk.main_quit } self.wTree.signal_autoconnect(dic) def run_back(self, value): print value self.engine = Engine() def run(self, widget): value = "some value..." print "Before!" gobject.idle_add(self.run_back, value) ## Comment line above an try line bellow! # self.run_back(value) print "After!" if __name__ == "__main__": app = AppGui() gtk.main()
Bellow we got the “gui.glade” file. It will be wrapped by “gui.py” above, so put it in the same directory before run.
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> <!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> <glade-interface> <widget class="GtkWindow" id="window1"> <property name="visible">True</property> <property name="title" translatable="yes">window1</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_NONE</property> <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> <property name="decorated">True</property> <property name="skip_taskbar_hint">False</property> <property name="skip_pager_hint">False</property> <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> <property name="focus_on_map">True</property> <property name="urgency_hint">False</property> <child> <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">0</property> <child> <widget class="GtkButton" id="button1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="label" translatable="yes"> Start </property> <property name="use_underline">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> <signal name="clicked" handler="on_button1_clicked" last_modification_time="Wed, 07 Mar 2007 18:35:44 GMT"/> </widget> <packing> <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> </packing> </child> </widget> </child> </widget> </glade-interface>
And It works, see by yourself. Although I’m still looking for others threading samples to user interfaces. Any sugestion?
Advertisements
Look at this, can be useful:
http://www.johnstowers.co.nz/blog/index.php/2007/03/12/threading-and-pygtk/