tkinter unbind函数不能正常工作

时间:2014-09-14 03:50:07

标签: python events tkinter

我在这里有一些代码:

def __GameOver__(self):

    self.canvas.unbind('<Up>');

    #other function ---

    time.sleep(2)

    self.canvas.bind('<Up>', func);

    self.root.after(40,self.GameMainLoop)
    pass

我想要的是,当游戏结束时,玩家无法做任何事情,直到“其他功能”和time.sleep(2)结束。但是,在我测试的时候,我发现如果我继续按 canvas.unbind('&lt; Up&gt;'); 之后按按钮之前 canvas.bind('&lt; Up&gt;'); 。仍然可以在 canvas.bind('&lt; Up&gt;')之后收到消息; < /strong>。这不是我想要的。但我找不到其他方法。关于对unbind函数的理解有什么不对吗?或者是否有类似“事件序列”的东西我应该在绑定函数之前清除?

1 个答案:

答案 0 :(得分:0)

您遇到的问题不在于解除绑定,而在于sleep。当您调用sleep时,不会处理任何事件,因此事件的处理在睡眠结束后以及再次绑定<Up>按钮时完成。考虑解除绑定,然后使用after方法进行休眠,然后调用再次绑定密钥的函数。

这是一个例子。当您按下时它会改变标签,当您按下按钮时它会睡觉。在此睡眠期间,向上键无效。

import Tkinter as tk
import random

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(self.root, text='Bla')
        self.label.pack()
        self.button = tk.Button(self.root, text='Button', command=self.sleep)
        self.button.pack()

        self.root.bind('<Up>', self.func)

        self.root.mainloop()

    def func(self, event):
        self.label.config(text='Up '+str(random.random()))

    def sleep(self):
        self.root.unbind('<Up>')
        self.label.config(text='sleeping')
        self.root.after(2000, self.done_sleeping)

    def done_sleeping(self):
        self.label.config(text='done sleeping')
        self.root.bind('<Up>', self.func)

App()