2016-04-25 9 views
1

私はPythonには新しく、さらにはtkinterにも関わらず、Tkinterを通して無限ループの開始と終了ボタンを作成しようと決めました。残念ながら、開始をクリックすると、停止をクリックできません。開始ボタンはインデントされたままで、トリガーされた関数がまだ実行されているため、開始ボタンはインデントされたままです。この2番目のボタンをコードを停止させるにはどうすればよいですか?Pythonでtkinterによってトリガされたループを停止する方法

import tkinter 

def loop(): 
    global stop 
    stop = False 
    while True: 
     if stop == True: 
      break 
     #The repeating code 
def start(): 
    loop() 
def stop(): 
    global stop 
    stop = True 

window = tkinter.Tk() 
window.title("Loop") 
startButton = tkinter.Button(window, text = "Start", command = start) 
stopButton = tkinter.Button(window, text = "Pause", command = stop) 
startButton.pack() 

答えて

2

あなたはwhile Trueを呼び出しています。長い話は短く、Tk()は独自のイベントループを持っています。したがって、長期実行プロセスを呼び出すたびに、このイベントループをブロックし、何もできません。おそらくafter

ここでを使用するのは、windowに属性を指定するだけで回避できます。

-

import tkinter 

def stop(): 

    window.poll = False 

def loop(): 

    if window.poll: 
     print("Polling") 
     window.after(100, loop) 
    else: 
     print("Stopped long running process.") 

window = tkinter.Tk() 
window.poll = True 
window.title("Loop") 
startButton = tkinter.Button(window, text = "Start", command = loop) 
stopButton = tkinter.Button(window, text = "Pause", command = stop) 
startButton.pack() 
stopButton.pack() 
window.mainloop() 
+0

ありがとうございます!これはほとんどの場合意味があります。私はafterの引数がafter(wait-time、function)の形であると仮定していますか? – Bugsy

+0

はい、時間はミリ秒です。したがって、1000 = 1秒です。 – Pythonista

+0

これは、ループが再帰的に呼び出されているので動作しますが、Pythonの999の最大深度に達するとスタックオーバーフローエラーが発生しませんか? –

関連する問題