У меня есть приложение с графическим интерфейсом Tkinter, в которое мне нужно ввести текст. Я не могу предположить, что приложение будет иметь фокус, поэтому я реализовал pyHook в стиле кейлоггера.
Когда окно GUI не имеет фокуса, ввод текста работает нормально, а переменная StringVar обновляется корректно. Когда окно графического интерфейса пользователя действительно имеет фокус, и я пытаюсь ввести текст, все происходит сбой.
т. е. если я нажму на окно консоли или что-нибудь еще после запуска программы, ввод текста сработает. Если я попытаюсь ввести текст немедленно (графический интерфейс запускается с фокусом) или перефокусирую окно в любой точке и введу текст, произойдет сбой.
Что происходит?
Ниже приведен минимальный полный проверяемый пример, чтобы продемонстрировать, что я имею в виду:
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()
mainloop()
работает в основном потоке. Кроме того, весь этот проект отлично работает в Linux, когда я использую контекст записи X. Это определенно проблема, связанная с pyHook. - person heidi   schedule 20.06.2016