如何同时检测 python 中的多个按键?

How do I detect multiple keypresses in python all at the same time?

我想对角移动我的机器人汽车,因此我想检测 'w' 是否与 'd' 或 'a' 一起按下。

如果我想使用 'w'、'a'、's'、'd' 作为我的密钥。

我现在的情况是这样的

from curtsies import Input  
with Input(keynames='curses') as input_generator:
    for key in input_generator:
        print(key)
        if key == 'w':
             #move forward
        if key == 's':
             #move backward
        if key == 'a':
             #move left
        if key == 'd':
             #move right
        if key == ' ':
             #stop

但我希望我的程序是这样的:

while True:
    while keypressed('w'):
        #move forward
    while keypressed('s'):
        #move backward
    while keypressed('a'):
        #move left
    while keypressed('d'):
        #move right
    while keypressed('w')&&keypressed('a'):
        #move forward left diagonally
    while keypressed('w')&&keypressed('d'):
        #move forward right diagonally

我还想知道什么时候松开钥匙,这样我就可以让车停下来。从本质上讲,我希望汽车能够像 GTA 或 NFS 这样的游戏中一样正常工作......

实现此目标的最简单方法是什么?代码越轻越好......

最好的方法是使用 pygame 模块。 pygame.key.get_pressed() returns一次按下的所有键的列表:

例如多次按键

if keys[pygame.K_w] and keys[pygame.K_a]:
    #Do something

documentation 中有更多详细信息。

如果可以接受较小的超时,一种可能的方法是使用 send method,如以下示例所示:

from curtsies import Input, events

with Input(keynames="curtsies", sigint_event=True) as input_generator:
    while True:
        key = input_generator.send(0.1)
        if key:
            print(key)
        if key and (
            key in ("q", "Q", "<ESC>", "<Ctrl-d>", "<SigInt Event>")
            or isinstance(key, events.SigIntEvent)
        ):
            print("Terminated")
            break
        if key and key == "<UP>":
            print('move up')
        print('.', end='', flush=True)