你的代码有几个问题.首先,你不应该在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()