Bonjour,
Je vous expose mon problème qui sur le principe n'est pas très compliqué:
J'ai créé une petite IHM (avec Glade) qui ne contient qu'un seul bouton à deux états (de type ToogleButton), et j'aimerais que:
- Si le bouton n'est pas clické, il ne se passe rien
- Si le bouton est clické, on effectue une action toute simple en tache de fond (print toutes les secondes par exemple)
Je suis parti sur l'utilisation des threads pour effectuer cela mais j'ai l'impression que GTK garde la main et ne la rend jamais.
Je m'attendrais a observer un print périodique toutes les secondes lorsque le bouton est clické et en fait, je n'observe que le premier print, dès que je passe dans le sleep(1), je sors de ma fonction PrintPeriodique.run() et je n'y retourne qu'au click suivant sur le bouton.
Voici mon code python et le contenu du fichier Glade associé:
Code :
- # -*- coding: cp1252 -*-
- import gtk
- import gtk.glade
- import time
- import threading
- class PrintPeriodique(threading.Thread):
- def __init__(self, begin):
- threading.Thread.__init__(self, target=self.run)
- self.Terminated = False
- self.begin = begin
- def run(self):
- self.i = self.begin
- while not self.Terminated:
- print self.i
- self.i += 1
- time.sleep(1)
- print "le thread s'est termine proprement"
-
- def stop(self):
- self.Terminated = True
- return self.i
-
- # Nous mettons tous nos handlers des signaux gtk dans une
- # classe. Ceci nous permet de les lier tous en une seule fois car leurs noms
- # sont dans le dictionnaire de la classe.
- class GladeHandlers:
- def on_togglebutton1_clicked(event):
- global thread_test
- if widgets['togglebutton1'].get_active():
- widgets['togglebutton1'].set_label("Printing..." )
- thread_test.start()
- else:
- print "On passe ici"
- widgets['togglebutton1'].set_label("Print" )
- i = thread_test.stop()
- thread_test = PrintPeriodique(i)
- class WidgetsWrapper:
- def __init__(self):
- self.widgets = gtk.glade.XML('ToogleButton.glade', "window1" )
- self.widgets.signal_autoconnect(GladeHandlers.__dict__)
- def __getitem__(self, key):
- """Ceci nous donne la possibilité de faire : widgets['widget_name'].action()"""
- return self.widgets.get_widget(key)
- if __name__ == '__main__':
- widgets = WidgetsWrapper()
- thread_test=PrintPeriodique(0)
- gtk.main()
|
Code :
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
- <!--Generated with glade3 3.4.3 on Mon Nov 03 10:55:35 2008 -->
- <glade-interface>
- <widget class="GtkWindow" id="window1">
- <property name="visible">True</property>
- <child>
- <widget class="GtkToggleButton" id="togglebutton1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="label" translatable="yes">Print</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="on_togglebutton1_clicked"/>
- </widget>
- </child>
- </widget>
- </glade-interface>
|
Merci d'avance pour toute info qui me permettrait d'avancer, mon objectif étant au final de construire une IHM plus complexe comprenant plusieurs boutons, chacun d'entre eux pouvant lancer des actions en tache de fond.