天天看點

python按鍵退出循環_python – TKinter – 如何使用停止按鈕停止循環?

你的代碼有幾個問題.首先,你不應該在Tkinter程式中使用time.sleep(),因為它會幹擾mainloop().相反,通常使用通用視窗小部件方法

.after()來排程在指定延遲之後運作的函數.

其次,你沒有正确使用全局變量.為函數中的命名變量指派時,它将建立一個局部變量,除非該名稱先前已聲明為全局變量.是以,例如,您的stop()函數正在建立一個名為running的局部變量,并将其值設定為0,而不是更改具有相同名稱的全局變量的值.

以前的規則不适用于僅引用(讀取)變量的目前值.這就是為什麼沒有在start()中聲明Freq和Dur全局變量的原因.

另一個問題是你的start()函數中的sec%1 == 0.任何值%1都是0.要檢查奇數/均勻度,請使用秒%2.

import Tkinter

import tkMessageBox

import time

import winsound

FREQ = 2500

DUR = 150

after_id = None

secs = 0

def beeper():

global after_id

global secs

secs += 1

if secs % 2 == 0: # every other second

winsound.Beep(FREQ, DUR)

after_id = top.after(1000, beeper) # check again in 1 second

def start():

global secs

secs = 0

beeper() # start repeated checking

def stop():

global after_id

if after_id:

top.after_cancel(after_id)

after_id = None

top = Tkinter.Tk()

top.title('MapAwareness')

top.geometry('200x100')

startButton = Tkinter.Button(top, height=2, width=20, text="Start",

command=start)

stopButton = Tkinter.Button(top, height=2, width=20, text="Stop",

command=stop)

startButton.pack()

stopButton.pack()

top.mainloop()