Tkinter按钮禁用不起作用

时间:2015-05-28 07:16:54

标签: python-2.7 tkinter

您好我正在尝试禁用按钮,以便命令事件在一段时间内不起作用。如何禁用该按钮一段时间后再重新启用它,以获得回调函数。

#! /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()

1 个答案:

答案 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,直到方法完成。