【发布时间】: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中访问以进行比较,但是_onKeyPressed在event对象中看到的回车键是不同的。为什么是这样?
【问题讨论】: