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 秒間フリーズし、その後プログラムが応答しなくなります。

フックまたは非同期更新を削除すると、バグは発生しません。

この問題の原因は何ですか?

編集:

Python 2.6 を使用して Windows 7 でテストしてきました。

4

0 に答える 0