考虑以下示例:
from Tkinter import *
import pyHook
class Main:
def __init__(self):
self.root = Tk()
self.root.protocol("WM_DELETE_WINDOW", self.onClose)
self.root.title("Timer - 000")
self.timerView = Text(self.root,
background="#000",
foreground="#0C0",
font=("Arial", 200),
height=1,
width=3)
self.timerView.pack(fill=BOTH, expand=1)
self.timer = 0
self.tick()
self.createMouseHooks()
self.root.mainloop()
def onClose(self):
self.root.destroy()
def createMouseHooks(self):
self.mouseHook = pyHook.HookManager()
self.mouseHook.SubscribeMouseAllButtons(self.mouseClick)
self.mouseHook.HookMouse()
def mouseClick(self, event):
self.timer = 300
return True
def tick(self):
self.timerView.delete(1.0, END)
self.timerView.insert(END, self.threeDigits(self.timer))
self.root.title("Timer - " + str(self.threeDigits(self.timer)))
self.timer = self.timer - 1 if self.timer > 0 else 0
self.root.after(1000, self.tick)
def threeDigits(self, number):
number = str(number)
while len(number) < 3:
number = "0" + number
return number
if __name__ == "__main__":
Main()
这将显示一个窗口并每秒异步更新一个文本小部件。它只是一个计时器,它会倒计时,并在用户单击鼠标按钮时重置为 300。
这确实有效,但有一个奇怪的错误。当程序运行时,您移动窗口,鼠标和程序将冻结 3-4 秒,然后程序停止响应。
如果你移除了钩子或者异步更新,那么这个 bug 就不会发生。
这个问题的原因可能是什么?
编辑:
我一直在使用 Python 2.6 在 Windows 7 中进行测试。