2

pynput (「pijnput」は痛みの穴に変換されます :-) ) モジュールを使用してキーボードをキャプチャしようとしています。この私のコード:

    class KeyPress:
    def __init__(self,parent):
        self.parent=parent

    def on_press(self,key):
        #keyboard.Listener.stop()
        try:
            self.parent.pressedKey=key.char
            self.parent.pressedKeyCode=None
        except AttributeError:
            self.parent.pressedKey=key
            self.parent.pressedKeyCode=key.value.vk
        return False


    def on_release(self,key):
        if key == keyboard.Key.esc:
            # Stop listener
            return False

    # Collect events until released
    def run(self):
        with keyboard.Listener(
                on_press=self.on_press,
                on_release=self.on_release,suppress=True) as listener:
            listener.join()

キーとキーコードをメイン クラスのプロパティに割り当てるサブクラスを作成します。これを実行すると、特定の数のキーを押してから X がクラッシュし、このエラーが発生するまで問題なく動作します。最初はこれをipython + tmuxで実行しましたが、純粋なbashでもこれが発生します。

Exception in thread Thread-131:
Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/site-packages/pynput/_util/__init__.py", line 136, in run
    self._run()
  File "/usr/lib/python3.7/site-packages/pynput/keyboard/_xorg.py", line 499, in _run
    super(Listener, self)._run()
  File "/usr/lib/python3.7/site-packages/pynput/_util/xorg.py", line 370, in _run
    self._display_record = Xlib.display.Display()
  File "/usr/lib/python3.7/site-packages/Xlib/display.py", line 89, in __init__
    self.display = _BaseDisplay(display)
  File "/usr/lib/python3.7/site-packages/Xlib/display.py", line 71, in __init__
    protocol_display.Display.__init__(self, *args, **keys)
  File "/usr/lib/python3.7/site-packages/Xlib/protocol/display.py", line 163, in __init__
    auth_prot_data = auth_data)
  File "/usr/lib/python3.7/site-packages/Xlib/protocol/display.py", line 1070, in __init__
    display.send_and_recv(request = -1)
  File "/usr/lib/python3.7/site-packages/Xlib/protocol/display.py", line 610, in send_and_recv
    raise self.socket_error
Xlib.error.ConnectionClosedError: Display connection closed by server

私の推測では、スレッドを終了しないため、スレッドを作成しすぎていると思います。「with」構造がそれを処理すると思いましたが?これは正しいです ?もしそうなら、私はそれを機能させるために何をすべきですか?

前もって感謝します

4

1 に答える 1