Pygame键被压了

时间:2016-02-01 17:00:28

标签: python-2.7 keyboard pygame

只要按下某个键,pygame运行某些东西的惯用方法是什么?使用pygame.key.get_pressed()[pygame.K_p]==Truepygame.mouse.get_pressed()==(1,0,0)时,它似乎只会在键或按钮被敲击时作出反应。应该使用while循环吗?

我运行下面的代码,只有在敲击键/按钮时才能在shell中打印:

def main():
done = True
while done:
    for i in pygame.event.get():
        if pygame.key.get_pressed()[pygame.K_a] == 1:
            print "Key a is being pressed..."
        elif i.type == KEYDOWN and i.key == pygame.K_q:
            done = 0
    pygame.display.update()
pygame.quit()
main()

2 个答案:

答案 0 :(得分:4)

事件KEYDOWN表示"键从UP更改为DOWN" - 它并不代表"键始终按下"

enter image description here

当你开始按键时 - 它生成事件KEYDOWNpygame.event.get()返回非空列表 - for循环可以执行if pygame.event.get()

当您按住键时 - 它不会生成事件KEYDOWN - 而pygame.event.get()会返回空列表 - for循环不会执行{{1} }

您的代码应该是

if pygame.event.get()

或 - 当您只需要执行一次

running = True
while running:
    # check events 
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == pygame.K_q:
               running = False

    # do it outside of `for event` loop
    # it is executed many times 
    if pygame.key.get_pressed()[pygame.K_a]: 
        print "Key is hold pressed..."

    pygame.display.update()

答案 1 :(得分:2)

您应该使用:

def main():
    done = False
    while not done:
        for i in pygame.event.get():
            if i.type == KEYDOWN and i.key == pygame.K_q:
                done = True

        pressed = pygame.key.get_pressed()     
        if pressed[pygame.K_a]:
            print "Key a is being pressed..."

        pygame.display.update()
    pygame.quit()

if __name__ == '__main__':
    main()

代码中的问题是,只有在迭代所有收到的事件时才检查按下的键;因此,如果没有事件,print "Key a is being pressed..."部分永远不会被执行。

将它放在事件循环之外。

此外,您不需要明确地与True进行比较;惯用/ pythonic方式是使用if pressed[pygame.K_a]: