[pygtk] thread & rafraichissement

thread & rafraichissement [pygtk] - Python - Programmation

Marsh Posté le 04-01-2007 à 12:39:50    

:hello:  
 
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 :(

Reply

Marsh Posté le 04-01-2007 à 12:39:50   

Reply

Marsh Posté le 04-01-2007 à 12:49:42    

putain mais luc je t'ai dit quoi : c'est pas bien de bloquer la boucle d'événement.
 
        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)  
 
 
"Ici la fenetre n'est pas freezé (toujours rafraichis si je la cache) parcontre le thread ne demarre que quand je click sur quitter. "
 
c'est cela oui ... tu bind un bouton sur quitter et un idle_add ... je ne vois pas le lien entre le bouton et le thread ...
 
RTFM gobject.idle_add, c'est pas comme ça qu'il faut s'en servir :o y a des params et un truc à retourner
 
et hop, ta version 3 marchera

Reply

Marsh Posté le 04-01-2007 à 12:51:10    

Reply

Marsh Posté le 04-01-2007 à 12:57:13    

euh luc au fait, t'aurais pas échoué en initant pas les threads un peu par hasard ? tiens un tuto : http://www.async.com.br/faq/pygtk/ [...] 20.006.htp
 
edit: si tu veux mettre à jour une barre de progression ou autre, il faut que ça vienne du thread principal. Donc genre style tu painchoc un timeout_add qui va chercher une info sur l'avancement et mets à jour l'UI.


Message édité par Taz le 04-01-2007 à 12:58:28
Reply

Marsh Posté le 04-01-2007 à 14:09:23    

je sais je sais je sais.
 
C'était donc bien l'initialisation des threads et les enter&leave qui me manquait.

Reply

Marsh Posté le 04-01-2007 à 15:59:10    

luc, le enter/leave pour faire des trucs gtk depuis un thread annexes, je trouve ça bof.

Reply

Marsh Posté le 04-01-2007 à 16:41:54    

c'est pas faux.
 
Mais la le trucs il le fallait pour le 1er janvier donc j'ai fais comme ca.
Maintenant je vais essayer de refaire pour que ce soit le thread principal qui mettent à jour tout bien.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed