tkinker解除绑定似乎没有解除绑定

时间:2018-09-05 19:33:17

标签: python tkinter tkinter-canvas

我有此代码:

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 但没有结果,因为我仍然可以单击正方形并从红色处获得打印结果

1 个答案:

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

单击时,将调用函数,并更改颜色并取消绑定事件。 然后,事件循环就有机会处理颜色变化并处理其他事件。时间过后,将调用您的函数,并且事件将重新绑定。