pyHook и wxPython - приложение зависает при наборе текста само по себе
У меня есть небольшое приложение на Python, которое создает фрейм wxPython, а затем использует pyHook для подключения клавиатуры. Фрейм содержит TextCtrl. Когда текст в элементе управления изменяется, создается поток, выполняющий некоторый процесс (в данном случае это просто большой цикл для имитации длинного процесса).
Если я сосредоточусь на TextCtrl и нажму на клавиатуру, приложение полностью заблокируется. Если я удалю код pyHook, приложение не заблокируется. Если я сделаю длинный процесс короче (например, только 10 итераций цикла), приложение не заблокируется.
Кажется, что-то связано с использованием pyHook при вводе в том же приложении, которое его создало.
Обратите внимание, что если я создаю перехват клавиатуры и вызываю PumpMessages из основного потока, приложение не блокируется, но в идеале я хочу создать перехват в отдельном потоке.
Есть идеи?
Спасибо майк
import threading
import pyHook
import pythoncom
import wx
class LargeTaskProcessor(object):
def do_task(self):
iterations = 1000000
# Simulate some large process
for i in range(iterations):
pass
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, 1, 'Title', size=(400, 400))
global_sizer = wx.BoxSizer(wx.VERTICAL)
self.test_textbox = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
self.Bind(wx.EVT_TEXT, self._event_happened, self.test_textbox)
global_sizer.Add(self.test_textbox)
self.SetAutoLayout(True)
self.SetSizer(global_sizer)
global_sizer.Fit(self)
global_sizer.SetSizeHints(self)
self.Layout()
def _event_happened(self, event=None):
action_thread = threading.Thread(target=obj.do_task)
action_thread.start()
def hook_the_keyboard():
hookManager = pyHook.HookManager()
hookManager.HookKeyboard()
pythoncom.PumpMessages()
if __name__ == '__main__':
app = wx.App()
obj = LargeTaskProcessor()
dialog_instance = TestFrame()
dialog_instance.Show()
dialog_instance.Raise()
# Create the hook manager and call PumpMessages on a separate thread
theThread = threading.Thread(target=hook_the_keyboard)
theThread.start()
app.MainLoop()
1 ответ
Попробуй удалить pythoncom.PumpMessages()
От pyHook Turorial сказал:
При запуске эта программа просто бездействует и ждет событий Windows. Если вы используете инструментарий GUI (например, wxPython), этот цикл не нужен, так как инструментарий предоставляет свой собственный.