Je voudrais faire une app qui fait un traitement assez lourd (plusieurs heures) avec plein de thread, je voudrais pouvoir visualiser avec pygtk l'etat des differents threads.
Avant de faire cette app je me suis fais quelques petits tests
J'ai une fonction toto qui prends au minimum 20sec d'execution et j'aimerais changé le titre la fenetre en fonction de l'avancement de la fonction
def toto(window):
print "sleeping"
window.set_title("sleeping" )
time.sleep(10)
print "wake up"
window.set_title("wake up" )
time.sleep(10)
window.set_title("done" )
print "done"
return True
|
Version 1
import pygtk
import gtk
import gobject
from threading import Thread
import time
if __name__ == "__main__":
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("destroy", lambda w: gtk.main_quit())
window.set_title("test" )
button = gtk.Button("Quit" )
button.connect("clicked", lambda w: gtk.main_quit())
window.add(button)
gobject.idle_add(toto, window)
window.show_all()
gtk.main()
|
Dans la console j'ai bien le "sleeping" qui s'affiche mais le titre de la fenetre ne change pas (meme en la cachant/deplacant & co)
Cela freeze l'application en fait comme si la fenetre n'etait rafraichis que quand toto a fini.
Version 2
if __name__ == "__main__":
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("destroy", lambda w: gtk.main_quit())
window.connect("expose_event", lambda w, e: toto(window))
window.set_title("test" )
button = gtk.Button("Quit" )
button.connect("clicked", lambda w: gtk.main_quit())
window.add(button)
window.show_all()
gtk.main()
|
idem.
Version 3
if __name__ == "__main__":
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("destroy", lambda w: gtk.main_quit())
window.set_title("test" )
button = gtk.Button("Quit" )
button.connect("clicked", lambda w: gtk.main_quit())
window.add(button)
t = Thread(target=toto, args=(window))
gobject.idle_add(t.start)
window.show_all()
gtk.main()
|
Ici la fenetre n'est pas freezé (toujours rafraichis si je la cache) parcontre le thread ne demarre que quand je click sur quitter.
Version 4
if __name__ == "__main__":
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("destroy", lambda w: gtk.main_quit())
window.connect("expose_event", lambda w, e: Thread(target=toto, args=(window)).start())
window.set_title("test" )
button = gtk.Button("Quit" )
button.connect("clicked", lambda w: gtk.main_quit())
window.add(button)
window.show_all()
gtk.main()
|
idem que la version 3 (sauf que la toto est lancé plein de fois mais c'est normal ca correspond au nombre de fois que j'ai masqué la fenetre)
Si quelqu'un pourrait m'aider
PS: je veux pas d'un bouton pour lancer le traitement j'aimerais qu'il se fasse au chargement (ou un peu aprés) de la fenetre 