1

考虑以下示例:

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 中进行测试。

4

0 回答 0