テキストを入力する必要がある Tkinter GUI アプリケーションがあります。アプリケーションにフォーカスがあるとは想定できないため、キーロガー スタイルの pyHook を実装しました。
GUI ウィンドウにフォーカスがない場合、テキスト入力は問題なく機能し、StringVar は正しく更新されます。GUI ウィンドウにフォーカスがあるときにテキストを入力しようとすると、すべてがクラッシュします。
つまり、プログラムの起動後にコンソール ウィンドウなどをクリックすると、テキスト入力が機能します。すぐにテキストを入力しようとすると (GUI がフォーカスされた状態で開始されます)、または任意の時点でウィンドウに再度フォーカスしてテキストを入力すると、クラッシュします。
どうしたの?
以下は、私が何を意味するかを示すための最小限の完全な検証可能な例です。
from Tkinter import *
import threading
import time
try:
import pythoncom, pyHook
except ImportError:
print 'The pythoncom or pyHook modules are not installed.'
# main gui box
class TestingGUI:
def __init__(self, root):
self.root = root
self.root.title('TestingGUI')
self.search = StringVar()
self.searchbox = Label(root, textvariable=self.search)
self.searchbox.grid()
def ButtonPress(self, scancode, ascii):
self.search.set(ascii)
root = Tk()
TestingGUI = TestingGUI(root)
def keypressed(event):
key = chr(event.Ascii)
threading.Thread(target=TestingGUI.ButtonPress, args=(event.ScanCode,key)).start()
return True
def startlogger():
obj = pyHook.HookManager()
obj.KeyDown = keypressed
obj.HookKeyboard()
pythoncom.PumpMessages()
# need this to run at the same time
logger = threading.Thread(target=startlogger)
# quits on main program exit
logger.daemon = True
logger.start()
# main gui loop
root.mainloop()