Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2855 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  [pygtk] thread & rafraichissement

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[pygtk] thread & rafraichissement

n°1498668
ffluff
Challenge Everything
Posté le 04-01-2007 à 12:39:50  profilanswer
 

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

mood
Publicité
Posté le 04-01-2007 à 12:39:50  profilanswer
 

n°1498677
Taz
bisounours-codeur
Posté le 04-01-2007 à 12:49:42  profilanswer
 

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

n°1498680
Taz
bisounours-codeur
Posté le 04-01-2007 à 12:51:10  profilanswer
 
n°1498691
Taz
bisounours-codeur
Posté le 04-01-2007 à 12:57:13  profilanswer
 

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
n°1498821
ffluff
Challenge Everything
Posté le 04-01-2007 à 14:09:23  profilanswer
 

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

n°1498923
Taz
bisounours-codeur
Posté le 04-01-2007 à 15:59:10  profilanswer
 

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

n°1498948
ffluff
Challenge Everything
Posté le 04-01-2007 à 16:41:54  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  [pygtk] thread & rafraichissement

 

Sujets relatifs
Rafraichissement d'un compteurStopper un Thread
ActionScript - Rafraichissement variable incrémentée[Blogger] Rafraichissement auto de la page
Thread sous windows...Rafraichissement d'une DataGrid
DataBindings + rafraichissement des données d'un TextBox[Ruby]Problème de Thread + Retry
[C# .NET] upload d'un fichier et thread limitant le temps d'upload ... 
Plus de sujets relatifs à : [pygtk] thread & rafraichissement


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)