单击退出pygame窗口

时间:2013-03-05 02:22:45

标签: python events click pygame exit

在这里发表我的第一篇文章(或坦率地说是任何论坛),但我想知道为什么在按下窗口的退出按钮[x]时我无法退出。我试过了:

#print "Exit value ", pygame.QUIT
for et in pygame.event.get():
    #print "Event type ", et.type
    if et.type == pygame.KEYDOWN:
            if (et.key == pygame.K_ESCAPE) or (et.type == pygame.QUIT):
                    print "In Here"
                    return True;
pygame.event.pump()# not quite sure why we do this
return False;

我发现pygame.QUIT打印的值为12,因为当我运行程序时,当我单击[x]时,事件类型会打印'12'。在这里,“在这里”字符串永远不会打印。当返回为真时(当我在键盘上按ESC键时)程序正确退出。我看了几个相关的问题:所以

我没有在IDLE上运行,我正在运行它:

Eclipse Juno Service Release 1.
Python 2.7.3与最新版本的pygame for 2.7(截至2013年3月4日) Windows 7& 8和Ubuntu 12.04LTS(Ubuntu中没有声卡错误的结果相同)

我已经在Windows 7中通过双击运行该程序的.py文件运行但仍未在[x]上退出。提前谢谢。

2 个答案:

答案 0 :(得分:2)

在你的活动循环中,

#print "Exit value ", pygame.QUIT
for et in pygame.event.get():
    #print "Event type ", et.type
    #-----------------------------------------------------------------#
    if et.type == pygame.KEYDOWN:
            if (et.key == pygame.K_ESCAPE) or (et.type == pygame.QUIT):
    #-----------------------------------------------------------------#
                    print "In Here"
                    return True;
pygame.event.pump()  # not quite sure why we do this
return False;

问题(2 #------------#)之间 让我们分析一下这个部分:

  1. 如果输入了if-block,et.type == KEYDOWN
  2. 您对QUIT的检查位于if et.type == KEYDOWN
  3. 由于et.typeKEYDOWN,因此不能QUIT ..
  4. 所以,你没有检查et.type == QUIT
    因此,即使单击“X”,您的窗口也不会退出。
  5. 怎么办?
    QUITKEYDOWN条件中拉出来,例如:

    done = False
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    done = True
                    break # break out of the for loop
            elif event.type == pygame.QUIT:
                done = True
                break # break out of the for loop
        if done:
            break # to break out of the while loop
    
        # your game stuff
    

    注意:

    • 在这些退货声明之后,您不需要;
    • 始终在不同的if-elif块中检查event.type,例如

      if event.type == pygame.QUIT:
           #...
      elif event.type == pygame.KEYDOWN:
           #...
      
    • 您不需要pygame.event.pump(),请参阅Here

答案 1 :(得分:0)

你的主循环应该是这样的

done = False
while not done:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE: done = True
        elif event.type == QUIT:
            done = True

    # draw etc...
    pygame.display.update()

然后,如果你在任何地方切换'完成',它就会很好地退出。