summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorDieter Verfaillie <dieterv@optionexplicit.be>2010-12-24 00:43:15 +1300
committerJohn Stowers <john.stowers@gmail.com>2010-12-24 00:43:15 +1300
commit5eea5d244e7a69b517f08506e8c1950fb721d6f9 (patch)
treef3f5b8020adbe01bf5588f626e7e1cc3e7b3451c /examples
parent93bb91eae76b162960c2c41b04aa3addeafb6763 (diff)
downloadpygtk-5eea5d244e7a69b517f08506e8c1950fb721d6f9.tar.gz
Add gtk threading example, bug 461551
Diffstat (limited to 'examples')
-rw-r--r--examples/threading/gtk_threading.py100
1 files changed, 100 insertions, 0 deletions
diff --git a/examples/threading/gtk_threading.py b/examples/threading/gtk_threading.py
new file mode 100644
index 00000000..452b81f5
--- /dev/null
+++ b/examples/threading/gtk_threading.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+
+
+import time
+import threading
+
+import gtk
+import gobject
+
+
+def identify(message):
+ t = threading.current_thread()
+ print t.name, message
+
+
+class WorkerThread(threading.Thread):
+ def __init__(self, window):
+ identify('Initializing new thread')
+
+ threading.Thread.__init__(self)
+ self.window = window
+
+ def run(self):
+ identify('Doing work in new thread')
+
+ for i in range(10):
+ # Let's do some hard work here
+ time.sleep(0.5)
+
+ # let the window know we did something
+ gobject.idle_add(self.window.worker_update, 'Doing hard work: %s' % str(i+1))
+
+ # and update the progressbar
+ fraction = (i + 1) / float(10)
+ gobject.idle_add(self.window.progress.set_fraction, fraction)
+
+ # We're done
+ gobject.idle_add(self.window.worker_join)
+
+
+class TestWindow(gtk.Window):
+ __gtype_name = 'TestWindow'
+
+ def __init__(self):
+ gtk.Window.__init__(self)
+ self.set_border_width(4)
+ self.connect('delete-event', self.on_delete_event)
+ self.working = False
+
+ self.vbox = gtk.VBox(spacing=4)
+ self.add(self.vbox)
+
+ self.progress = gtk.ProgressBar()
+ self.vbox.pack_start(self.progress)
+
+ self.label = gtk.Label()
+ self.vbox.pack_start(self.label)
+
+ self.button = gtk.Button('start thread')
+ self.button.connect('clicked', self.button_clicked)
+ self.vbox.pack_start(self.button)
+
+ def on_delete_event(self, widget, event):
+ if self.working:
+ # do not close this window now, we'e working!
+ return True
+ else:
+ return False
+
+ def button_clicked(self, button):
+ self.button.set_sensitive(False)
+ self.worker_start()
+
+ def worker_start(self):
+ self.working = True
+ self.worker = WorkerThread(self)
+ self.worker.start()
+
+ def worker_update(self, value):
+ t = threading.current_thread()
+ print t.name, 'Updating label'
+ self.label.set_text(value)
+
+ def worker_join(self):
+ self.worker.join()
+ self.button.set_sensitive(True)
+ self.label.set_text('Done!')
+ self.working = False
+
+
+if __name__ == '__main__':
+ gobject.threads_init()
+
+ testwindow = TestWindow()
+ testwindow.connect('delete-event', gtk.main_quit)
+ testwindow.show_all()
+
+ gtk.main()
+
+