【问题标题】:Problem reading three simultaneous key press input using pynput library python使用pynput库python读取三个同时按键输入的问题
【发布时间】:2022-12-25 06:51:54
【问题描述】:

我正在尝试使用 pynput python 库一起读取三个按键,以在 ROS 中模拟类似游戏的机器人驱动器。它工作得很好,但问题是每当我按下左箭头键对于任何其他键,最后一个(第三个)键不会被读取。我在另一台 PC 上试过代码,它有同样的问题。 我相信理解我要说的内容的最好方法就是使用我将在下面粘贴的代码(您可以将 key.left 更改为任何其他键,例如 key.page_up):

from pynput.keyboard import Key, KeyCode, Listener

## ###     read combination of more than one key i.e three keys      #####
## ###     one can also apply it to two keys by making the key_buffer array to take two elements      #####

key_buffer = [None, None, None]

def press(key):
    global key_buffer
    if key == Key.up:
        if key not in key_buffer:
            if None in key_buffer:
                key_buffer[key_buffer.index(None)] = key
                print(key_buffer)
    elif key == Key.down:
        if key not in key_buffer:
            if None in key_buffer:
                key_buffer[key_buffer.index(None)] = key
                print(key_buffer)
    elif key == Key.left:
        if key not in key_buffer:
            if None in key_buffer:
                key_buffer[key_buffer.index(None)] = key
                print(key_buffer)
    elif key == Key.right:
        if key not in key_buffer:
            if None in key_buffer:
                key_buffer[key_buffer.index(None)] = key
                print(key_buffer)
    elif key == Key.alt:
        if key not in key_buffer:
            if None in key_buffer:
                key_buffer[key_buffer.index(None)] = key
                print(key_buffer)
    elif key == Key.space:
        if key not in key_buffer:
            if None in key_buffer:
                key_buffer[key_buffer.index(None)] = key
                print(key_buffer)
    
def release(key):
    global key_buffer
    if key == Key.up:
        if key in key_buffer:
            key_buffer[key_buffer.index(key)] = None
            print(key_buffer)
    elif key == Key.down:
        if key in key_buffer:
            key_buffer[key_buffer.index(key)] = None
            print(key_buffer)
    elif key == Key.left:
        if key in key_buffer:
            key_buffer[key_buffer.index(key)] = None
            print(key_buffer)
    elif key == Key.right:
        if key in key_buffer:
            key_buffer[key_buffer.index(key)] = None
            print(key_buffer)
    elif key == Key.alt:
        if key in key_buffer:
            key_buffer[key_buffer.index(key)] = None
            print(key_buffer)
    elif key == Key.space:
        if key in key_buffer:
            key_buffer[key_buffer.index(key)] = None
            print(key_buffer)
    
def main():
    listener = Listener(on_press=press, on_release=release)
    listener.start()
    listener.join()


if __name__=="__main__":
    main()

在尝试上面的代码之前,请记住安装到 pynput 库

pip3 install pynput

我只想知道导致问题的原因以及可能的解决方案。

【问题讨论】:

    标签: python pynput


    【解决方案1】:

    您发布的代码适用于我正在运行的机器(M1 MacBook Pro)。但是,我将提出一种替代方法来捕获三个同时按下的按键:

    from pynput.keyboard import Key, Listener
    
    allowedKeys = [
        Key.up,
        Key.down,
        Key.left,
        Key.right,
        Key.alt,
        Key.space
    ]
    
    key_buffer = []
    
    def press(key):
        global key_buffer
        if key in allowedKeys and key not in key_buffer and len(key_buffer) < 3:
            key_buffer.append(key)
            print(key_buffer)
    
    def realease(key):
        global key_buffer
        
        if(key in key_buffer):
            key_buffer.pop( key_buffer.index(key) )
            print(key_buffer)
    
    def main():
        listener = Listener(on_press=press, on_release=realease)
        listener.start()
        listener.join()
    
    if __name__ == '__main__':
        main()
    

    上面的代码将当前按下的键添加到key_buffer,只要key_buffer的长度小于3,该键就是允许键,key_buffer的长度小于3。

    要删除密钥,我们只需检查 key_buffer 是否包含当前释放的密钥,如果它确实从列表中弹出

    【讨论】:

      猜你喜欢
      • 2021-10-29
      • 2014-03-05
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 2015-05-01
      相关资源
      最近更新 更多