使用pynput库python读取三个同时按键输入的问题



我正在尝试使用pynput python库来模拟ROS中类似游戏的机器人驱动器来读取三个按键。它工作得很好,但问题是每当我按下左方向键时对于任何其他键,都不会读取最后(第三个)键。我在另一台PC上尝试了代码,它有同样的问题。我相信理解我想说的最好的方法就是玩我将粘贴在下面的代码(您可以更改密钥)。左到任何其他键(例如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

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

您发布的代码适用于我正在运行的机器(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是否包含当前释放的键,如果它确实从列表中弹出

相关内容

最新更新