2013-12-08 450 views
1

我一直在試着用2個按鈕製作一個程序,按其中一個會啓動一個無限循環,按下另一個會停止它。Python tkinter啓動和停止循環?

所有嘗試過的方法都會暫停循環。

from Tkinter import * 
import time 
s = 0 

def stopit(): 
    s = 1 
    print "stoped" 
# 
def callback(): 

    if s == 0: 
     while True: 
      print "called the callback!" 
      time.sleep(3) 
      if s == 1: 
       break 
      # 
     # 
    # 
# 

root = Tk() 

def main(): 


    # create a menu 
    menu = Menu(root) 
    root.config(menu=menu) 

    b = Button(root, command=stopit) 
    b.pack() 


    filemenu = Menu(menu) 
    menu.add_cascade(label="File", menu=filemenu) 
    filemenu.add_command(label="New", command=callback) 
    filemenu.add_command(label="Open...", command=callback) 
    filemenu.add_separator() 
    filemenu.add_command(label="Exit", command=callback) 

    helpmenu = Menu(menu) 
    menu.add_cascade(label="Help", menu=helpmenu) 
    helpmenu.add_command(label="About...", command=callback) 

    mainloop() 
    time.sleep(3) 
# 

main() 
+0

問題是什麼?另請發佈相關代碼。 – Fiver

+0

我試圖做到這一點,如果你按下一個按鈕,它會運行一個循環,如果你按另一個按鈕,它會停止它。 – Anthony

+0

@tobias_k。你什麼意思?我想要它,所以它打破了循環,而不是暫停。 – Anthony

回答

2

有兩個問題與您的代碼:

  • callback方法永遠無法完成(由於無限循環),從而導致GUI凍結。方法結束後,請使用after方法安排另一次執行callback
  • 您的stopit方法創建局部變量s而不是更改全局變量。使用global關鍵字來解決這個問題。

更改兩種方法來這樣的事情,它應該工作:

def stopit(): 
    global s 
    s = 1 
    print "stopped" 

def callback(): 
    if s == 0: 
     print "called the callback!" 
     root.after(3000, callback) 
+0

我試過這個http://pastebin.com/gmwc9nTx但我在Tkinter回調中遇到了這個錯誤異常 回溯(最近調用最後一次): 文件「/usr/lib/python2.7/lib-tk/Tkinter.py 「,第1473行,在__call__中 return self.func(* args) 文件」gui.py「,第12行,在回調中 如果s == 0: NameError:全局名稱's'未定義 – Anthony

+0

I fixed通過這樣做http://pastebin.com/SwknxkCs錯誤,但現在當我點擊停止它只是說停住了,但繼續前進 – Anthony

+0

糟糕!我忘了全球!謝謝! – Anthony