2010-12-09 50 views
0

Voici ma situation. Disons que je voudrais créer un thread qui imprime continuellement le numéro 1. Quand un bouton est cliqué, la valeur devrait alors changer à 2. Mon problème est que je ne sais pas comment je change une variable dans un thread en cours d'exécution. Voici mon code:Comment changer une variable dans un thread?

import wx 
from threading import Thread 
import time 

class testThread(Thread): 
    def __init__(self, parent): 
     self.parent = parent 
     Thread.__init__(self) 
     self.start() 

    def run(self): 
     while 1: 
      x = 1 
      print x 
      time.sleep(1) 

class testGUI(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, "Test", size=(500,270)) 
     panel = wx.Panel(self, -1) 

     self.buttonStart = wx.Button(panel, -1, label="Start thread", pos=(0,0)) 
     self.buttonChange = wx.Button(panel, -1, label="Change var", pos=(0,30)) 
     panel.Bind(wx.EVT_BUTTON, self.startThread, id=self.buttonStart.GetId()) 
     panel.Bind(wx.EVT_BUTTON, self.changeVar, id=self.buttonChange.GetId()) 

    def startThread(self, event): 
     testThread(self) 

    def changeVar(self, event): 
     # DO SOMETHING HERE THAT CHANGES 'x' IN THREAD TO 2... 
     pass 

if __name__ == '__main__': 
    app = wx.App(redirect=False) 
    frame = testGUI() 
    frame.Show(True) 
    app.MainLoop() 

La question est, qu'est-ce que je mets dans la fonction changeVar qui modifiera le contenu de la variable x qui est dans le fil conducteur? Merci d'avance!

Répondre

2

Vous ne pouvez pas modifier les variables locales.

Ce que vous pouvez faire est la suivante:

class testThread(Thread): 
    def __init__(self, parent): 
     self.parent = parent 
     Thread.__init__(self) 
     self.start() 

    def run(self): 
     self.value = 1 
     while 1: 
      print self.value 
      time.sleep(1) 

class testGUI(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, "Test", size=(500,270)) 
     panel = wx.Panel(self, -1) 

     self.buttonStart = wx.Button(panel, -1, label="Start thread", pos=(0,0)) 
     self.buttonChange = wx.Button(panel, -1, label="Change var", pos=(0,30)) 
     panel.Bind(wx.EVT_BUTTON, self.startThread, id=self.buttonStart.GetId()) 
     panel.Bind(wx.EVT_BUTTON, self.changeVar, id=self.buttonChange.GetId()) 

    def startThread(self, event): 
     self.the_thread = testThread(self) 

    def changeVar(self, event): 
     # DO SOMETHING HERE THAT CHANGES 'x' IN THREAD TO 2... 
     self.the_thread.value = 2 

if __name__ == '__main__': 
    app = wx.App(redirect=False) 
    frame = testGUI() 
    frame.Show(True) 
    app.MainLoop() 
+0

Génial, merci THC4k, cela fonctionne parfaitement! – radian

1

Vous n'avez pas besoin pour que les discussions, du tout. wx inclut un wx.Timer qui vous permet d'appeler votre fonction avec un intervalle de temps dans le même thread. Les chances sont que wx inclut une fonction pour faire ce que vous voulez, aussi:

import wx 

class testGUI(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, "Test", size=(500,270)) 
     panel = wx.Panel(self, -1) 
     self.buttonStart = wx.Button(panel, -1, label="Start timer", pos=(0,0)) 
     self.buttonChange = wx.Button(panel, -1, label="Change var", pos=(0,30)) 
     panel.Bind(wx.EVT_BUTTON, self.startTimer, id=self.buttonStart.GetId()) 
     panel.Bind(wx.EVT_BUTTON, self.changeVar, id=self.buttonChange.GetId()) 
     self.value = 1 
     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.printer, self.timer) 

    def startTimer(self, event): 
     self.timer.Start(1000) # 1 second 

    def printer(self, event): 
     print self.value 

    def changeVar(self, event): 
     self.value = 2 

if __name__ == '__main__': 
    app = wx.App(redirect=False) 
    frame = testGUI() 
    frame.Show(True) 
    app.MainLoop() 
+0

Merci pour la réponse. Eh bien cet exemple est juste à des fins d'affichage. J'utiliserai le threading pour lire et écrire sur un réseau de contrôleur. Un thread sera dédié à l'interrogation des données et l'autre thread sera utilisé pour l'écriture. Le thread d'écriture devra transmettre des données et un intervalle de temps constant et la valeur à envoyer dépendra de ce que l'utilisateur a saisi dans l'interface graphique. J'ai donc besoin d'un moyen pour que les données soient communiquées de la fonction de gestion des boutons au thread, d'où mon dilemme. Bien sûr, je pourrais utiliser des variables globales, mais il doit y avoir une meilleure façon de le faire. – radian