【问题标题】:How to detect key press event and key hold down event without using pygame如何在不使用pygame的情况下检测按键事件和按键事件
【发布时间】:2019-01-12 04:18:06
【问题描述】:

我目前正在寻找能够检测/监控键盘的库。 我的目的是检测何时按下某个键,并且当它发生时应该发生一些事情。

大多数 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 循环中,无法摆脱它。

【问题讨论】:

    标签: python keyboard-events


    【解决方案1】:

    我发现的最简单的方法之一是使用 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.*)
    

    【讨论】:

    • 我试了你贴的代码,它只检测到一次按下,当按键被按住时,回调函数只被调用一次。
    • 为什么不把这个sn-p绑定到while True:try block
    • 你的意思是while True: try: 试过了,但是结果卡在了那个while循环里,出不来了。
    • 添加了带有 while 循环 @Nerdy 的代码。如果你尝试一下,你会发现它被卡在了while循环中。
    【解决方案2】:

    其实很简单。几行代码就搞定了!

    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"

    【讨论】:

    • 没那么简单。在我的系统上,像许多系统一样,由于操作系统的按键重复功能,按住 键会以一系列按下和释放的形式出现。 IE。除非您在系统级别禁用键重复,否则您无法检测到按住键。
    • @cdlane 同样,它变成了很多印刷机。但它足够接近,并且有点工作!
    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2019-04-22
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多