禁用和更新后,Tkinter Button仍会响应单击

时间:2019-04-05 12:33:19

标签: python user-interface 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()

1 个答案:

答案 0 :(得分:2)

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")