我在 tkinter/ttk 中开发了一个用户界面,它使用标准 ttk.Button 小部件来使用“command”参数调用各种函数。问题是,如果用户双击按钮,该函数将被调用两次。这会导致各种各样的问题。双击事件没有绑定任何东西,那么有没有办法禁用第二次单击?我在函数定义开始时尝试了 time.sleep() 和 after() 但我还没有找到让它工作的方法。我是否需要手动将每个函数绑定到每个按钮的单击并重新分配事件处理程序?有什么简单的方法可以全面忽略双击???
只需告诉按钮的回调函数(其
command
)禁用按钮,然后在短暂的时间(此处为200ms)后将其恢复正常。
def callback(self):
self.my_button.config(state=tk.DISABLED)
self.root.after(200, lambda: self.my_button.config(state=tk.NORMAL))
# other actions
正如 Bryan 指出的那样,等待函数完成更好更简单(除非您只是想防止意外双击并且同意在函数完成之前再次调用该函数):
def callback(self):
self.my_button.config(state=tk.DISABLED)
# other actions
self.my_button.config(state=tk.NORMAL)
此示例代码假定导入
import tkinter as tk
、一个 OO 应用程序结构、一个名为 self.my_button
的按钮、一个名为 self.callback
的回调函数以及一个名为 self.root
的根对象。
1、功能有
__dict__
2,添加
try except
,如果出现错误,state=tk.NORMAL不会调用
3、
config(state=tk.DISABLED)
快速双击时不阻止运行两次
import tkinter as tk
import time
import threading
root = tk.Tk()
def real_on_click():
real_on_click.btn.config(state=tk.DISABLED)
real_on_click.btn.update()
try:
print('command')
time.sleep(1)
except:
pass
real_on_click.btn.config(state=tk.NORMAL)
def on_click():
print('on_click')
if not (getattr(on_click,'timer',None) and on_click.timer.is_alive()):
on_click.timer = threading.Timer(0.1, real_on_click)
on_click.timer.start()
btn = tk.Button(root,text='button',command=on_click)
real_on_click.btn=btn
btn.pack()
root.mainloop()