Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不使用pygame的情况下检测按键事件和按键按住事件_Python_Keyboard Events - Fatal编程技术网

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

Python 如何在不使用pygame的情况下检测按键事件和按键按住事件,python,keyboard-events,Python,Keyboard Events,我目前正在寻找一个能够检测/监控键盘的库。 我的意图是检测何时按下了一把钥匙,当它发生时,应该会发生什么事情 大多数SO帖子都建议使用pygame,但我觉得它有点太多了,无法为这个简单的任务使用这样的库。我还尝试了pynput,结果只检测到一次按压,而不是一连串按压 当按下/按住某个键时,有没有关于如何执行此操作的建议 我对while循环的尝试: from pynput import keyboard def on_press(key): while key == keyboard.K

我目前正在寻找一个能够检测/监控键盘的库。 我的意图是检测何时按下了一把钥匙,当它发生时,应该会发生什么事情

大多数SO帖子都建议使用pygame,但我觉得它有点太多了,无法为这个简单的任务使用这样的库。我还尝试了
pynput
,结果只检测到一次按压,而不是一连串按压

当按下/按住某个键时,有没有关于如何执行此操作的建议

我对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循环中,无法摆脱它

我发现的最简单的方法之一是使用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
收集事件直到发布 以上是为我设计的示例,要安装,请继续


其实很简单。只要几行代码,就完成了

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”

我完全尝试了您发布的代码,它只检测到当按下并按住键时,回调函数只被调用一次。为什么不将此代码段绑定到
中呢,但这会导致被困在while循环中,而无法退出。添加了带有while循环@Nerdy的代码。若你们尝试一下,你们会发现它被困在while循环中。并不是那个么简单。在我的系统上,像许多人一样,由于操作系统的按键重复功能,按下按键会出现一系列的按下和释放。也就是说,除非在系统级禁用“按键重复”,否则无法检测到以这种方式按下按键。@cdlane同样,它也会变成大量按下。但这已经够近了,而且还挺管用的!
sudo pip install pynput (pip3 if python3.*)
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," ")