Tkinter按钮在禁用和更新后仍然响应单击



我希望按钮启动命令,然后在执行时禁用,并在执行完成后再次启用。

当我单击该按钮时,它似乎已禁用并执行命令。但是当我在禁用按钮时单击该按钮时,该命令在完成第一次执行后会再次执行。

似乎在第二次单击之后,该按钮确实被禁用了,因为我可以在禁用时单击几次,并且只重复一次。

import tkinter as tk
import time

class Button:
    def __init__(self, master):
        frame=tk.Frame(master)
        frame.pack()
        self.button1=tk.Button(frame, text="Ready",bg="green", fg="white", command=self.click)
        self.button1.pack()
    def click(self):
        self.button1.config(bg="red", text="Busy", state="disabled")
        self.button1.update()
        doSth()
        self.button1.config(bg="green", fg="white", text="Ready", state="normal")
        self.button1.update()

def doSth():
    time.sleep(3)
    print("done")

root = tk.Tk()
b = Button(root)
root.mainloop()
当您在

sleep期间单击该按钮时,您将按钮单击排队等待在下一个更新周期中进行处理。在sleep期间,tkinter 不会更新。sleep后,您将按钮更改回正常状态,然后函数返回并处理单击。由于按钮再次处于活动状态,因此会再次调用click

您可以通过让 tkinter 在再次激活按钮之前更新来解决这个问题,这会在按钮仍处于停用状态时删除任何排队的单击事件。

def click(self):
    self.button1.config(bg="red", text="Busy", state="disabled")
    self.button1.update()
    doSth()
    self.button1.update()
    self.button1.config(bg="green", fg="white", text="Ready", state="normal")

最新更新