Bonjour,
je tente en vain de lancer une fonction en parralèle de mon interface pygtk.
j'ai une classe dédiée à l'interface, qui contient un bouton
j'ai connecté le bouton à un fonction plop() définit telle que :
def plop(self,widget,data):
scan = Scan(data)
scan.start()
Dans ma fonction scan (qui est donc un Thread) j'ai un appel à os.path.walk
Bref, à chaque clic sur mon bouton, le thread se lance, affiche une ligne, puis se stoppe. Si je reclic, il recommence, et va 1 ligne plus loin. Et ainsi de suite.
J'ai cherché des docs sur les threads en gtk, et j'suis tombé sur des methodes, qui m'ont ammené à modifier mon code un peu hativement de la sorte :
def go(self,widget,data):
gtk.gdk.threads_enter()
scan = Scan(data)
scan.start()
gtk.gdk.threads_leave()
avec dans mon __init__ de ma classe de gui :
gtk.gdk.threads_init()
Mais désormais ca freeze dès que je clique sur mon bouton... :(
Bref, j'suis pas sûr de bien avoir saisi les threads sous gtk, quelqu'un veut il bien m'expliquer ce que j'ai loupé ??
Merci !
# Pour résumer
Posté par cho7 (site web personnel) . Évalué à 2.
comment instancier et lancer un objet donc la classe herite de Thread à partir d'un click de bouton gtk, pour le lancer en arrière plan, et le détacher totalement de l'interface (le but d'un thread quoi...)
(Re) merci.
[^] # Re: Pour résumer
Posté par cho7 (site web personnel) . Évalué à 2.
[^] # Re: Pour résumer
Posté par cho7 (site web personnel) . Évalué à 2.
[^] # Re: Pour résumer
Posté par cho7 (site web personnel) . Évalué à 2.
[^] # Re: Pour résumer
Posté par cho7 (site web personnel) . Évalué à 2.
J'ai placé les fonctions gtk.gdk.threads_enter() et gtk.gdk.threads_leave() dans le code de ma fonction run (dans scan),juste avant d'acceder a une variable de ma fenetre gtk (un label que je suis censé mettre a jour à chaque itération), et là ca semble marque, même sans timer.
Chouette chouette chouette :+)
Donc je résume, si quelqu'un me lit (pour l'instant j'suis un peu seul), j'aimerai confirmation :
quand on créé un thread censé modifier une interface GTK (pour updater le texte d'un label par exemple) on doit d'abord :
1. gtk.gdk.threads_init() avant le gtk.main()
2. encapsuler le moment du thread où l'on accede à l'interface par les methodes gtk.gdk.threads_enter() et gtk.gdk.threads_leave()
J'ai bon ?
[^] # Re: Pour résumer
Posté par fredix . Évalué à 2.
[^] # Re: Pour résumer
Posté par cho7 (site web personnel) . Évalué à 2.
'fin bref, problème résolu.
# stfw
Posté par nicolasr . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.