2010-12-09 49 views
0

这是我的情况。比方说,我想创建一个线程,不断打印数字1.当单击一个按钮时,值应该变为2.我的问题是,我不确定如何在已经运行的线程中更改变量。这里是我的代码:如何更改线程中的变量?

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

所以,问题是,我该怎么放在功能changeVar将修改变量x是在正在运行的线程的内容是什么?提前致谢!

回答

2

您不能更改局部变量。

你可以做的是这样的:

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

真棒,感谢THC4k,这个作品完美! – radian 2010-12-09 23:24:55

1

你不需要为主题,在所有。 wx包含一个wx.Timer,它允许你在同一个线程中以一定的时间间隔调用你的函数。机会是,wx包括一个功能,可以做你想做的事情:

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

感谢您的回复。那么这个例子只是为了显示目的。我将使用线程来读写控制器区域网络。一个线程将专用于轮询数据,另一个线程将用于写入。写入线程将需要传输数据和固定的时间间隔,并且要发送的值将取决于用户在GUI中输入的内容。所以我需要一些方法来将数据从按钮处理函数传递到线程,因此是我的困境。当然,我可以使用全局变量,但必须有更好的方法来做到这一点。 – radian 2010-12-09 23:18:03