Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Pygame键被按下_Python 2.7_Keyboard_Pygame - Fatal编程技术网

Python 2.7 Pygame键被按下

Python 2.7 Pygame键被按下,python-2.7,keyboard,pygame,Python 2.7,Keyboard,Pygame,对pygame来说,只要按下一个键,它就可以运行某个东西,这种惯用方式是什么?使用pygame.key.get_pressed()[pygame.K_p]==True或pygame.mouse.get_pressed()==(1,0,0)它似乎只在按键或按钮按下时才会做出反应。例如,应该使用while循环吗 我运行下面的代码,仅在按下键/按钮时才会在shell中打印: def main(): done = True while done: for i in pygame.event.ge

对pygame来说,只要按下一个键,它就可以运行某个东西,这种惯用方式是什么?使用
pygame.key.get_pressed()[pygame.K_p]==True
pygame.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()

事件
KEYDOWN
表示“按键状态从上到下发生变化”-并不表示“一直按住按键”

当您开始按键时,它会生成event
KEYDOWN
pygame.event.get()
返回非空列表-如果pygame.event.get()

当您按住键时-它不会生成事件
KEYDOWN
pygame.event.get()
返回空列表-如果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()
或者-当您只需要执行一次某个操作时

key_A_pressed = False

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

            elif event.key == pygame.K_a:
               key_A_pressed = True

               # it is executed only once
               print "Key A - start pressing"

        if event.type == KEYUP:
            if event.key == pygame.K_a:
               key_A_pressed = False

               # it is executed only once
               print "Key A - stop pressing"

    # do it only once - outside of `for event` loop
    # it is executed many times 
    #if pygame.key.get_pressed()[pygame.K_a]: 
    # or
    if key_A_pressed:
        print "Key A is held pressed..."

    pygame.display.update()
你应使用:

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“按键a…”
部分

把它放在事件循环之外


此外,您不需要显式地与
True
进行比较;惯用的/python式的方法是,如果按下[pygame.K_a]:

不要使用
get_pressed()。。。在pygame.event.get()中
。如果有很多事件,您将重复多次函数,如果没有事件,您将重复零次函数。谢谢您的回答。我想这对我来说是个误会;这意味着
键.get_pressed
应该在每个
循环时刷新,以便提供连续的输出?那么,该选项与在while循环之外编写if event.type==KEYDOWN和event.key==pygame.K_a
有什么区别呢?我尝试了这两种方法,它们似乎都有相同的效果。当你按下一个键时,会生成一个
KEYDOWN
事件。如果释放钥匙,将生成
KEYUP
事件。按住键不会创建新事件(除非启用键重复,这是不应该的)。你能举一个例子,明确地说,
key.get_pressed
应该是优先选择的吗?每次你想知道某个键是否被按下时(通常是指:如果按下左箭头,继续向左移动)。谢谢,如果我理解正确,那么按住某个键或按钮不算是一个事件?所以您没有使用pygame.key。是否完全没有按下
?如果可以用
event.type==KEYDOWN
来刺激保持这样的距离,那么应该在何时何地使用它?