gpt4 book ai didi

python - 有没有办法在 Python 中捕获击键并过滤掉由按键重复生成的击键?

转载 作者:太空宇宙 更新时间:2023-11-04 05:20:39 26 4
gpt4 key购买 nike

我正在 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
^[$

关于python - 有没有办法在 Python 中捕获击键并过滤掉由按键重复生成的击键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40490644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com