Tkinter按钮由于某种原因激活了另一个功能

时间:2019-06-16 22:12:36

标签: python tkinter

嗨,我首先要说我是一个新手,最近开始学习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)

理想情况下,清除按钮不应触摸计数器功能,所以我不知道发生了什么。

1 个答案:

答案 0 :(得分:1)

如果单击“开始”按钮,调用counter(),然后执行seclabel.after(1000, counter),然后单击“停止”,设置start = False,然后快速单击“清除”将其设置为start = True,在start再次调用True之前,全局counter()很有可能会重置为after() }方法会在1000毫秒后调用。

执行此操作的正确方法是取消任何先前的seclabel.after(1000, counter)呼叫并设置start = False。这可以通过使用通用的after_cancel()方法来完成。