【发布时间】:2019-04-05 12:33:18
【问题描述】:
我希望按钮启动命令,然后在执行时禁用并在执行完成后再次启用。
当我单击按钮时,它似乎被禁用并且命令被执行。但是当我在按钮被禁用时单击该按钮时,该命令在完成第一次执行后第二次执行。
似乎在第二次单击后,该按钮确实被禁用了,因为我可以在它被禁用时单击几次,并且只重复一次。
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()
【问题讨论】:
-
很奇怪。 effbot.org/tkinterbook/widget.htm#Tkinter.Widget.update-method 建议不要在回调中使用
update,但切换到update_idletasks只会让问题变得更糟——它不允许两次点击,而是允许无限次点击。 -
tkinter 在一个线程中运行。当您运行长时间运行的进程时 - 例如
sleep- 它会停止mainloop并且它无法正确更新小部件。有时它看起来像窗口冻结(挂断)。您应该在新线程中运行长时间运行的进程 -
您应该更改您的类名“Button”,因为 tkinter 已经有一个 Button 类。这不会解决您的问题,但应该这样做。我知道您将 tkinter 导入为 tk 但仍然如此。
标签: python user-interface tkinter