您好我正在尝试禁用按钮,以便命令事件在一段时间内不起作用。如何禁用该按钮一段时间后再重新启用它,以获得回调函数。
#! /usr/bin/python
from Tkinter import *
import Tkinter as tk
import time
class MyFrame(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.b1 = Button(self, text="Press Me!",command = self.callback)
self.count=0
self.but_flag=0
self.b1.grid()
def callback(self):
self.b1['state'] = DISABLED
for k in range(5):
time.sleep(1)
print k
self.b1['state'] = NORMAL
mainw = Tk()
mainw.f = MyFrame(mainw)
mainw.f.grid()
mainw.mainloop()
答案 0 :(得分:1)
问题是sleep
功能中的callback
阻止了用户界面刷新。您可以使用sleep
安排重新启用按钮,而无需使用after
。
def callback(self):
self.b1['state'] = DISABLED
self.after(3000, self.enable)
def enable(self):
self.b1['state'] = NORMAL
但是如果你在callback
中执行任何长时间运行的任务,这仍然会冻结用户界面。
另一种选择是创建一个工作线程来完成实际工作。这样,UI线程不会被阻止,UI将被更新并且按钮被停用/激活。
def callback(self):
threading.Thread(target=self.do_actual_work).start()
def do_actual_work(self):
self.b1['state'] = DISABLED
for i in range(5):
print i
time.sleep(1)
self.b1['state'] = NORMAL
当然,您也可以在禁用行之后添加self.b1.update()
以将Button小部件更新为其禁用状态,但这仍然会冻结UI,直到方法完成。