【问题标题】:Tkinter button activating another function for some reason出于某种原因,Tkinter 按钮激活了另一个功能
【发布时间】:2019-06-16 22:12:36
【问题描述】:

您好,首先让我说我是这方面的新手,最近开始学习 Python,目前正在学习 Tkinter 以制作一些 GUI 应用程序。

我在这里构建了一个非常简单的秒表应用程序,其中包含开始、停止和清除按钮。一切正常,除了我遇到一个函数被另一个不应该调用它的按钮随机调用的问题。

boolean start 默认设置为 True。当您单击“开始”按钮时,它会调用检查 start 是否为 True 的 starter 函数,如果是,它会启动一个计数器。当您按下“停止”按钮时,它会调用一个停止函数,该函数只是通过将 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)

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

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

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

    正确的做法是取消之前的任何seclabel.after(1000, counter) 调用并设置start = False。这可以通过使用通用的after_cancel() 方法来完成。

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2019-07-31
      相关资源
      最近更新 更多