我在这里有一些代码:
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函数的理解有什么不对吗?或者是否有类似“事件序列”的东西我应该在绑定函数之前清除?
答案 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()