我有此代码:
def on_click(event=None):
c.unbind('<Button-1>')
c.config(background="red")
print ("You clicked the square")
time.sleep(delay)
c.config(background="green")
c.bind('<Button-1>', on_click)
root.update()
root = tk.Tk()
c = tk.Canvas(root, width=200, height=200, background="green")
c.pack()
c.bind('<Button-1>', on_click)
root.mainloop()
当我在红色(未绑定)的画布上单击时,在完成睡眠后会打印“您单击了正方形”。
我已经在这里尝试过这种方法:Deleting and changing a tkinter event binding 但没有结果,因为我仍然可以单击正方形并从红色处获得打印结果
答案 0 :(得分:2)
您正在呼叫unbind
,然后冻结该应用程序。冻结后,事件将继续被添加到队列中,而不会被处理。睡眠完成后,立即在队列有机会处理事件之前重新建立绑定。到处理事件时,绑定将已经重新建立。
根据一般经验,永远不要在GUI程序中调用sleep
,这是一个很好的说明。
如果要在短时间内取消绑定然后重新设置,请取消绑定,然后在给定时间段后使用after
对其重新设置。
def on_click(event=None):
c.unbind('<Button-1>')
c.config(background="red")
c.after(delay, enable_binding)
def enable_binding():
c.config(background="green")
c.bind('<Button-1>', on_click)
单击时,将调用函数,并更改颜色并取消绑定事件。 然后,事件循环就有机会处理颜色变化并处理其他事件。时间过后,将调用您的函数,并且事件将重新绑定。