使用pynput库python阅读三个同时按下的键输入时出现问题

ih99xse1  于 2022-12-25  发布在  Python
关注(0)|答案(1)|浏览(134)

I'm trying to read three key press together using the pynput python library to simulate a game-like robot drive in ROS. It's working quite all right but the problem is that when ever I press theleft arrow keywith any other key, the last (third) key is not being read. I've tried the code on another PC and it had the same problem. I believe the best way to understand what I'm trying to say is to just play with the code which I'll paste below (you can change the key.left to any other key e.g 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

我只是想知道是什么原因造成的问题和可能的解决办法。

arknldoa

arknldoa1#

您发布的代码可以在我运行的机器(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是否包含当前释放的密钥,以及它是否从列表中弹出该密钥

相关问题