【问题标题】:event.key seems to not be Key [pynput]event.key 似乎不是 Key [pynput]
【发布时间】:2023-01-12 11:52:50
【问题描述】:

我正在编写一个使用 pynput 收集原始键盘输入的应用程序。我需要一种可以在运行时任意实例化、删除、启用和禁用的按键事件形式,因此 pynput 的全局热键系统无法工作。所以,我创建了自己的事件类:

keyEvents = []

class keyEvent():
    def __init__(self, key, callback, onPress, onRelease):
        self.key = key,
        self.callback = callback
        self.onPress = onPress
        self.onRelease = onRelease
        self.active = True
        self.calls = []
        keyEvents.append(self)

    # Called from listener thread, do not call callbacks from listener thread because then things happen at unpredictable times
    def fire(self, state):
        if self.active:
            print('{} fired {}({})'.format(self.key, self.callback, state))
            if self.onPress and state: self.calls.append(True)
            elif self.onRelease and not state: self.calls.append(False)

def _onKeyPress(key):
    print(key, key == keyboard.Key.enter)
    for event in keyEvents:
        if event.key == key: event.fire(True)
        else: print('Event did not fire {} != {}'.format(event.key, key))

def _onKeyRelease(key):
    for event in keyEvents:
        if event.key == key: event.fire(False)

在这里我创建了几个事件,由menu.exec轮询:

class menu():
    def __init__(self, name):
        self.name = name
        self.items = []
        self.keyEvents = [
            keyEvent(keyboard.Key.left,  self._keyLeft,  True, False),
            keyEvent(keyboard.Key.right, self._keyRight, True, False),
            keyEvent(keyboard.Key.up,    self._keyUp,    True, False),
            keyEvent(keyboard.Key.down,  self._keyDown,  True, False),
            keyEvent(keyboard.Key.enter, self._keyEnter, True, False)
        ]
        for event in self.keyEvents: event.active = False

    ...

    def exec(self):
        for event in self.keyEvents: event.active = True
        self.refresh()
        self.active = True
        while self.active:
            for event in self.keyEvents:
                for call in event.calls:
                    event.callback(call)
            time.sleep(0.1)

当我运行该应用程序时,它会在我按下回车键后给出以下输出:

Key.enter True
Event did not fire (<Key.left: <65361>>,) != Key.enter
Event did not fire (<Key.right: <65363>>,) != Key.enter
Event did not fire (<Key.up: <65362>>,) != Key.enter
Event did not fire (<Key.down: <65364>>,) != Key.enter
Event did not fire (<Key.enter: <65293>>,) != Key.enter

第一行告诉我传递给_onKeyPress的密钥确实是keyboard.Key.enter。最后 5 行告诉我 _onKeyPress 拒绝为所有 5 个事件调用 event.fire,包括分配给 keyboard.Key.enter 的事件。 event.key 代码中没有其他地方被修改。它首先在keyEvent.__init__中设置并在_onKeyPressed中访问以进行比较,但是_onKeyPressedevent对象中看到的回车键是不同的。为什么是这样?

【问题讨论】:

    标签: python pynput


    【解决方案1】:

    解决了!在 keyEvent.__init__ 我有这个松散​​的逗号:

    class keyEvent():
        def __init__(self, key, callback, onPress, onRelease):
            self.key = key,
            ...
    

    松散的逗号就像松散的电线。他们惹上麻烦了。

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2022-11-10
      • 2022-11-26
      相关资源
      最近更新 更多