我正在 Python 中试验一些输入法,并使用 pynput
我有一个简单的抓取器用于按下和释放键,就像在文档中一样:
from pynput.keyboard import Key, Listener
def on_press(key):
print('{0} pressed'.format(
key))
def on_release(key):
print('{0} release'.format(
key))
if key == Key.esc:
# Stop listener
return False
# Collect events until released
with Listener(
on_press=on_press,
on_release=on_release) as listener:
listener.join()
但是,无论键是由重复键生成还是仅由按下键生成,都会调用 on_press,据我所知,我不知道它是哪个。
有办法知道吗?我的目标平台是 macOS,但这应该有望在 Windows 上运行,而且我可能希望有一天能移植这个想法。
pynput
很好,但我不介意切换库,如果这意味着我可以获得我需要的东西来工作的话。
如果发生按键重复事件(至少在我的 Ubuntu 系统上),则会生成/模拟额外的按键事件,而不会干预按键释放事件:
$ python keypress_vs_repeat.py
Key.enter release
a'a' pressed
a'a' pressed
a'a' pressed
a'a' pressed
a'a' release
您可以使用该信息来区分真实按键和模拟按键:
keypress_vs_repeat.py
from pynput.keyboard import Key, Listener
currently_pressed_key = None
def on_press(key):
global currently_pressed_key
if key == currently_pressed_key:
print('{0} repeated'.format(key))
else:
print('{0} pressed'.format(key))
currently_pressed_key = key
def on_release(key):
global currently_pressed_key
print('{0} release'.format(key))
currently_pressed_key = None
if key == Key.esc:
# Stop listener
return False
# Collect events until released
with Listener(
on_press=on_press,
on_release=on_release) as listener:
listener.join()
测试(按一次a,按住b):
$ python keypress_vs_repeat.py
Key.enter release
'a' pressed
a'a' release
'b' pressed
b'b' repeated
b'b' repeated
b'b' repeated
b'b' repeated
b'b' repeated
b'b' release
Key.esc pressed
^[Key.esc release
^[$
我是一名优秀的程序员,十分优秀!