如何在按钮python 2.7中添加Debouching

时间:2018-07-24 07:03:50

标签: python tkinter raspberry-pi

我创建了一个按钮。我希望如果有人反复单击,它将只执行一次。我禁用了按钮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秒的点击。

1 个答案:

答案 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))