2012-08-23 52 views
1

我的問題與此類似:Python TKinter multiple operations。但是,所提供的答案並不能幫助我,因爲它指向一個包含可用函數列表的文章。我希望看到解決方案的實際實施。Tkinter多種操作

我的問題:我有一個框架上的兩個按鈕。只要切換變量設置爲true,一個按鈕就會調用「執行」功能。第二個按鈕將切換值設置爲False。我希望'執行'功能繼續下去,一旦我按下執行按鈕,但停止當我按下第二(切換false)按鈕。但是,一旦我按下「執行」,框架就會卡住。我明白這是因爲回調。我怎樣才能解決這個問題?繼承人我的示例代碼:

from Tkinter import * 
from time import sleep 

class App: 

    def __init__(self, master): 

     self.toggle = False 
     frame = Frame(master) 
     frame.pack() 

     self.exeButton = Button(frame, text="Execute", fg="blue", command=self.execute) 
     self.exeButton.pack(side=LEFT) 

     self.tOffButton = Button(frame, text="Toggle Off", command=self.toggleOff) 
     self.tOffButton.pack(side=LEFT) 

    def execute(self): 
     self.toggle = True 
     while(self.toggle): 
      print "hi there, everyone!" 
      sleep(2) 

    def toggleOff(self): 
    self.toggle = False 

root = Tk() 
app = App(root) 
root.mainloop() 

回答

4

簡短的回答,你不能做到你想要的。 Tkinter是單線程的 - 當你打電話給sleep(2)時,它完全符合你的要求:睡覺。

如果您的目標是每2秒鐘執行一次操作,只要布爾標誌設置爲True,則可以使用after安排將來運行的作業。如果該作業在重新調度之後也會使用,那麼實際循環機制就是事件循環本身,您已經有效地創建了一個無限循環。

我已經採取了你的代碼並作了一些細微的修改,告訴你如何持續執行一些事情,直到一個標誌告訴它停止。我冒昧地將「切換」重命名爲「跑步」,使其更容易理解。我也只用一種方法來打開和關閉執行。

from Tkinter import * 
from time import sleep 

class App: 

    def __init__(self, master): 

     self.master = master 
     self.running = False 
     frame = Frame(master) 
     frame.pack() 

     self.exeButton = Button(frame, text="Execute", fg="blue", 
      command=lambda: self.execute(True)) 
     self.exeButton.pack(side=LEFT) 

     self.tOffButton = Button(frame, text="Toggle Off", 
      command=lambda: self.execute(False)) 
     self.tOffButton.pack(side=LEFT) 

    def execute(self, running=None): 
     if running is not None: 
      self.running = running 
     if self.running: 
      print "hi there, everyone!" 
      self.master.after(2000, self.execute) 

root = Tk() 
app = App(root) 
root.mainloop() 
+0

謝謝!這有很大幫助。 –

+0

如果我們有一個問題,每次我們有一個問題,答案基本上是這樣的:「不要使用'sleep',使用'Widget.after'而不是」,我們現在可能會有一美元:^)。 – mgilson

+0

以下是另一種情況,您可能會花費10倍以上的金額:我是GUI編程的新手。或者,我是python的新手。另外,我從未使用過Tkinter。 –