次の例を検討してください。
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 でテストしてきました。