我正在尝试使用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
是否包含当前释放的键,如果它确实从列表中弹出