你的代碼有幾個問題.首先,你不應該在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()