#!/usr/bin/python import threading import gtk import random import time gtk.gdk.threads_init() NUM_THREADS = 10 class PyApp(gtk.Window): def __init__(self, threads=None): super(PyApp, self).__init__() self.connect("destroy", self.quit) self.set_title("pyGTK Threads Example") vbox = gtk.VBox(False, 4) self.threads = [] for i in range(NUM_THREADS + 1): pb = gtk.ProgressBar() vbox.pack_start(pb, False, False, 0) self.threads.append(ProgressThread(pb, random.uniform(0.01, 0.10))) self.add(vbox) self.show_all() def quit(self, obj): for t in self.threads: t.stop() gtk.main_quit() class ProgressThread(threading.Thread): def __init__(self, progressbar, step_value): threading.Thread.__init__ (self) self.pb = progressbar self.step = step_value self.stopthread = threading.Event() def run(self): while not self.stopthread.isSet(): cur_frac = self.pb.get_fraction() new_frac = cur_frac + self.step if new_frac > 1.0: new_frac = 1.0 gtk.gdk.threads_enter() self.pb.set_fraction(new_frac) gtk.gdk.threads_leave() if self.pb.get_fraction() == 1.0: break time.sleep(0.1) def stop(self): self.stopthread.set() if __name__ == "__main__": pyapp = PyApp() for t in pyapp.threads: t.start() gtk.gdk.threads_enter() gtk.main() gtk.gdk.threads_leave()