0

wxPython フレームを作成し、pyHook を使用してキーボードをフックする小さな python アプリケーションがあります。Frame には 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()
4

1 に答える 1

1

削除してみてくださいpythoncom.PumpMessages()

pyHook turorialから次のように述べています。

実行すると、このプログラムはアイドル状態になり、Windows イベントを待ちます。GUI ツールキット (wxPython など) を使用している場合は、ツールキットが独自に提供するため、このループは不要です。

于 2014-05-25T15:27:16.783 に答える