Pygtk simple y ejemplo de hilos por favor

¿Puede alguien darme un ejemplo simple que involucre hilos de esta manera, por favor?

El problema con mi código es que cuando hago clic en el botón Uno, la GUI se bloquea hasta que finaliza. Quiero que los botones se mantengan receptivos cuando se está ejecutando def. ¿Cómo puedo arreglar eso?

class fun: wTree = None def __init__( self ): self.wTree = gtk.glade.XML( "ui.glade" ) dic = { "on_buttonOne" : self.one, "on_buttonTwo" : self.two, } self.wTree.signal_autoconnect( dic ) gtk.main() def sone(self, widget): time.sleep(1) print "1" time.sleep(1) print "2" time.sleep(1) print "3" def stwo(self, widget): time.sleep(1) print "4" time.sleep(1) print "5" time.sleep(1) print "6" do=fun() 

Bastante por favor, ayúdame.

Al usar gtk, ejecutará un bucle principal, y usted progtwigrá todo lo que quiera hacer como eventos en el bucle gtk. No necesitas hilos para hacer nada.

Aquí hay un ejemplo completo, completo, listo para ejecutar que utiliza glib.timeout_add para hacer lo que quieras.

Tenga en cuenta que al hacer clic en ambos botones (o varias veces en un botón) no se congela la interfaz gráfica de usuario y todo sucede “al mismo tiempo” …

 import gtk import glib def yieldsleep(func): def start(*args, **kwds): iterable = func(*args, **kwds) def step(*args, **kwds): try: time = next(iterable) glib.timeout_add_seconds(time, step) except StopIteration: pass glib.idle_add(step) return start class Fun(object): def __init__(self): window = gtk.Window() vbox = gtk.VBox() btnone = gtk.Button('one') btnone.connect('clicked', self.click_one) btnone.show() vbox.pack_start(btnone) btntwo = gtk.Button('two') btntwo.connect('clicked', self.click_two) btntwo.show() vbox.pack_start(btntwo) vbox.show() window.add(vbox) window.show() @yieldsleep def click_one(self, widget, data=None): yield 1 #time.sleep(1) print '1' yield 1 #time.sleep(1) print '2' yield 1 #time.sleep(1) print '3' @yieldsleep def click_two(self, widget, data=None): yield 1 #time.sleep(1) print '4' yield 1 #time.sleep(1) print '5' yield 1 #time.sleep(1) print '6' do = Fun() gtk.main() 

Use Python Threads: http://docs.python.org/library/threading.html

Algo como:

 class SoneThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.start() # invoke the run method def run(self): time.sleep(1) print "1" time.sleep(1) print "2" time.sleep(1) print "3" 

Ahora en sone solo llama a SoneThread (), eso debería funcionar.

También debes llamar a gtk.gdk.threads_init () para que los hilos de python funcionen con tu aplicación GTK +.

Consulte: http://library.gnome.org/devel/pygtk/stable/gdk-functions.html#function-gdk–threads-init