如何在不使用pygame的情况下检测按键事件和按键长按事件

3

我目前正在寻找一个能够检测/监控键盘的库。

我的意图是在按住某个按键时检测到,并且在该情况发生时应该执行某些操作。

大多数SO帖子建议使用pygame,但我觉得这对于这个简单的任务来说有些过度。我也尝试过使用pynput,但结果仅仅能检测到一次按键而不是连续按下。

有什么建议可以让这个while循环检测到按键被按下/按住...

我的while循环尝试:

from pynput import keyboard

def on_press(key):
    while key == keyboard.Key.cmd_l:
        try:
            print('- Started recording -'.format(key))
        except IOError:
            print "Error"
    else:
        print('incorrect character {0}, press cmd_l'.format(key))


def on_release(key):
    print('{0} released'.format(key))
    if key == keyboard.Key.cmd_l:
        print('{0} stop'.format(key))
        keyboard.Listener.stop
        return False



with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

这个 while 解决方案会使其陷入 while 循环中,无法跳出。

2个回答

4

我发现最简单的方法之一是使用pynput模块。可以在这里找到它,还有很好的示例。

from pynput import keyboard

def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))

def on_release(key):
    print('{0} released'.format(
        key))
    if key == keyboard.Key.esc:
        # Stop listener
        return False

收集事件直到释放

with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

上面是为我解决的示例,要安装,请执行。
sudo pip install pynput (pip3 if python3.*)

我尝试了您发布的代码,它只能检测到按键被按下并保持按下的情况下的一次按压,回调函数只会被调用一次。 - Mama
1
为什么不将这段代码绑定到一个 while True:try 块中? - user8253094
你的意思是 while True: try: 吗?我试过了,但结果却一直停留在那个 while 循环里面,无法跳出。 - Mama
已经添加了while循环的代码@Nerdy。如果你尝试运行它,你会发现它一直停留在while循环中。 - Mama

0

实际上非常简单。只需要几行代码,就做完了!

from turtle import *

def a():
    print("key is pressed!")
    forward(5)

def b():
    print("key is not pressed!")
    backward(30)

listen()
onkeypress(a," ")
onkeyrelease(b," ")

你可以用任何一个你选择的键将空格替换,用""括起来,例如:"a","h","e","Up","y"


并不是那么简单。在我的系统上,就像许多其他系统一样,由于操作系统的按键重复功能,按住键会被识别为一系列的按下和释放。也就是说,除非你在系统级别禁用按键重复功能,否则无法通过这种方式检测到按住键。 - cdlane
@cdlane 同样的问题,需要按很多次。但它已经足够接近,并且基本能用! - arkanon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接