3

在这里(或者坦率地说是任何论坛)发表我的第一篇文章,但我想知道为什么我不能在按下窗口的退出按钮 [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”。“In here”字符串在这些情况下从不打印。当返回为真时程序正确退出(当我在键盘上按 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 中没有声卡错误,结果相同)

我通过双击运行程序的 .py 文件在 Windows 7 中运行,但仍然没有在 [x] 上退出。提前致谢。

4

2 回答 2

2

你的主循环应该是这样的

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()

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

于 2013-03-05T03:11:22.013 回答
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 块,et.type == KEYDOWN
  2. 你的支票QUITif et.type == KEYDOWN.
  3. 既然et.typeKEYDOWN,那不可能是QUIT..
  4. 因此,您没有检查et.type == QUIT
    因此,即使您单击“X”,您的窗口也不会退出。

该怎么办?
拉出你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

笔记:

  • 你不需要;在那些返回语句之后
  • 始终检查event.type不同的 if-elif 块,例如

    if event.type == pygame.QUIT:
         #...
    elif event.type == pygame.KEYDOWN:
         #...
    
  • 你不需要pygame.event.pump()那里,看这里
于 2013-03-05T12:01:15.167 回答