我希望按钮启动命令,然后在执行时禁用,并在执行完成后再次启用。
当我单击该按钮时,它似乎已禁用并执行命令。但是当我在禁用按钮时单击该按钮时,该命令在完成第一次执行后会再次执行。
似乎在第二次单击之后,该按钮确实被禁用了,因为我可以在禁用时单击几次,并且只重复一次。
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")