我创建了一个按钮。我希望如果有人反复单击,它将只执行一次。我禁用了按钮3秒钟。但是当按钮正常时,它将执行每次单击序列。我希望在禁用状态下单击将被忽略。怎么做??
from Tkinter import *
import Tkinter,MySQLdb,tkFont,datetime,time,tkMessageBox,socket,os
from datetime import datetime
class Reception_Qm(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()
def initialize(self):
self.grid()
self.button1 = Tkinter.Button(self, text = my_button,bg="blue",activebackground="yellow",\
width=18,font=('Sans','30','bold'),relief=RIDGE,\
command = lambda: self.print_token('hello'),fg="white",height=1)
self.button1.grid(column=0,row=0,sticky='NSEW')
def print_token(self,catagory):
print "hello"
self.button1.flash()
self.button1.config(state=DISABLED)
time.sleep(3)
self.button1.config(state=NORMAL)
if __name__ == "__main__":
window = Reception_Qm(None)
window.title("Test App")
window.mainloop()
如果在禁用状态下也按下了按钮,则当按钮进入正常状态时它将进入print_token函数。我只想忽略点击。我想忽略持续时间少于3秒的点击。
答案 0 :(得分:2)
您不能在事件处理程序的中间进行time.sleep
这样的操作。如果这样做,您就不会返回主循环,这意味着tkinter无法处理任何事件,甚至不能禁用按钮的事件。
当然,当您最终返回时,tkinter可以开始处理事情,但是在那一点上,在按钮禁用后,按钮启用立即排入队列,因此按钮仅被禁用了一秒钟。
您需要做的是将函数的后半部分拆分为一个单独的函数,让tkinter在3秒内为您运行该函数,然后立即返回:
def print_token(self,catagory):
print "hello"
self.button1.flash()
self.button1.config(state=DISABLED)
self.after(3000, lambda: self.button1.config(state=NORMAL))