2010-12-09 47 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