嗨,我首先要说我是一个新手,最近开始学习Python,目前正在学习Tkinter来制作一些GUI应用程序。
我在这里用开始,停止和清除按钮构建一个非常简单的秒表应用程序。一切正常,除了我遇到的问题是某个函数被另一个不应调用的按钮随机调用。
默认情况下,布尔值开始设置为True。当您单击“启动”按钮时,它将调用启动程序函数,该函数检查启动是否为True,如果是,则启动一个计数器。当您按下“停止”按钮时,它会调用停止器功能,只需将start更改为False即可停止计数器。当您单击“清除”按钮时,它将调用一个清除器函数,该函数将重置第二个和分钟值,并且更改开始返回为True(因此,如果通过“开始”按钮调用计数器功能,则可以继续)。>
我遇到的问题是,如果您单击“停止”,然后快速单击“清除”,由于某种原因,它将激活计数器功能并开始计数。我不明白为什么会这样,因为从理论上讲,只有在按下“开始”按钮时,它才应该调用该函数。
我尝试过使用不同的布尔触发器,例如“ start is not False”和类似的东西,但是没有运气。
secs = -1
mins = 0
start = True
def counter():
global secs, mins, start
if start is True:
seclabel.after(1000, counter)
secs += 1
if secs == 60:
secs = 0
mins += 1
minlabel.configure(text=str(mins))
seclabel.configure(text=str(secs))
startbutt.configure(state=DISABLED, bg="grey")
stopbutt.configure(state=NORMAL, bg="red")
def stopper():
global start
start = False
stopbutt.configure(state=DISABLED, bg="grey")
clearbutt.configure(state=NORMAL, bg="blue")
def clearer():
global start, secs, mins
secs = -1
mins = 0
minlabel.configure(text="0")
seclabel.configure(text="0")
clearbutt.configure(state=DISABLED, bg="grey")
startbutt.configure(state=NORMAL, bg="green")
start = True
stopbutt = Button(window, text="Stop", bg="grey", fg="white", font="arial 15 bold", command=stopper, state=DISABLED)
stopbutt.grid(row=2, column=1, pady=20, padx=20)
clearbutt = Button(window, text="Clear", bg="grey", fg="white", font="arial 15 bold", command=clearer, state=DISABLED)
clearbutt.grid(row=3, column=1, pady=20, padx=20)
startbutt = Button(window, text="Start", bg="green", fg="white", font="arial 15 bold", command=counter, state=NORMAL)
startbutt.grid(row=2, column=0, pady=20, padx=20)
理想情况下,清除按钮不应触摸计数器功能,所以我不知道发生了什么。
答案 0 :(得分:1)
如果单击“开始”按钮,调用counter()
,然后执行seclabel.after(1000, counter)
,然后单击“停止”,设置start = False
,然后快速单击“清除”将其设置为start = True
,在start
再次调用True
之前,全局counter()
很有可能会重置为after()
}方法会在1000毫秒后调用。
执行此操作的正确方法是取消任何先前的seclabel.after(1000, counter)
呼叫并设置start = False
。这可以通过使用通用的after_cancel()
方法来完成。