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
我只是想知道是什么原因造成的问题和可能的解决办法。
1条答案
按热度按时间arknldoa1#
您发布的代码可以在我运行的机器(M1 MacBook Pro)上运行。但是,我将提出一个替代方法来捕获三个同时按下的键:
上面的代码将当前按下的键添加到
key_buffer
,只要key_buffer
的长度小于3,该键是允许的键,并且key_buffer
的长度小于3。要删除密钥,只需检查
key_buffer
是否包含当前释放的密钥,以及它是否从列表中弹出该密钥