Python Tkinter按钮出于某种原因激活另一个功能

Python Tkinter按钮出于某种原因激活另一个功能,python,tkinter,Python,Tkinter,大家好,首先让我说我是这方面的新手,最近开始学习Python,目前正在学习Tkinter来制作一些GUI应用程序 我在这里构建一个非常简单的秒表应用程序,包括开始、停止和清除按钮。除了我遇到一个问题,一个函数被另一个不应该调用它的按钮随机调用之外,一切都正常 默认情况下,布尔起始值设置为True。当您单击“开始”按钮时,它将调用starter函数来检查Start是否为True,如果为True,它将开始一个计数器。当您按下“停止”按钮时,它会调用一个停止函数,该函数通过将start更改为False

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

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

默认情况下,布尔起始值设置为True。当您单击“开始”按钮时,它将调用starter函数来检查Start是否为True,如果为True,它将开始一个计数器。当您按下“停止”按钮时,它会调用一个停止函数,该函数通过将start更改为False来停止计数器。当您单击“清除”按钮时,它将调用一个更清晰的函数,该函数将重置秒和分钟值,并将“开始”更改回True(这样,如果“开始”按钮调用计数器函数,它可以继续)

我遇到的问题是,如果您单击“停止”,然后快速单击“清除”,它会出于某种原因激活计数器功能并开始计数。我不明白为什么会发生这种情况,因为理论上,它应该只在按下“开始”按钮时调用该函数

我试过搞乱不同的布尔触发器,比如“开始不是假的”之类的东西,但没有运气

secs=-1
分钟=0
开始=真
def计数器():
全球秒,分钟,开始
如果start为True:
seclabel.after(1000,计数器)
秒+=1
如果秒=60:
秒=0
分钟+=1
配置(text=str(分钟))
seclabel.configure(text=str(secs))
startbutt.configure(状态=禁用,bg=“灰色”)
stopbutt.configure(状态=正常,bg=“红色”)
def stopper():
全球启动
开始=错误
stopbutt.configure(状态=禁用,bg=“灰色”)
clearbutt.configure(状态=正常,bg=“蓝色”)
def clear():
全球启动,秒,分钟
秒=-1
分钟=0
minlabel.configure(text=“0”)
seclabel.configure(text=“0”)
clearbutt.configure(状态=禁用,bg=“灰色”)
startbutt.configure(状态=正常,bg=“绿色”)
开始=真
stopbutt=按钮(窗口,text=“Stop”,bg=“grey”,fg=“white”,font=“arial 15 bold”,命令=停止,状态=禁用)
stopbutt.grid(行=2,列=1,pady=20,padx=20)
clearbutt=按钮(窗口,text=“Clear”,bg=“grey”,fg=“white”,font=“arial 15 bold”,命令=更清晰,状态=禁用)
clearbutt.grid(行=3,列=1,pady=20,padx=20)
开始按钮=按钮(窗口,text=“开始”,bg=“绿色”,fg=“白色”,font=“arial 15 bold”,命令=计数器,状态=正常)
startbutt.grid(行=2,列=0,pady=20,padx=20)
理想情况下,清除按钮不应触碰计数器功能,因此我不知道发生了什么。

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

正确的方法是取消以前的
seclabel.after(1000,counter)
调用,并设置
start=False
。这可以通过使用通用方法来实现