【问题标题】:Pygame programs hanging on exitPygame 程序在退出时挂起
【发布时间】:2010-01-08 11:06:06
【问题描述】:

我现在正在修补 pygame,当我尝试关闭它们时,似乎我用它制作的所有小程序都会挂起。

以如下代码为例:

from pygame.locals import *
pygame.init()
# YEEAAH!
tile_file = "blue_tile.bmp"
SCREEN_SIZE = (640, 480)
SCREEN_DEPTH = 32

if __name__ == "__main__":
    screen = pygame.display.set_mode(SCREEN_SIZE, 0, SCREEN_DEPTH)
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                break

    tile = pygame.image.load(tile_file).convert()
    colorkey = tile.get_at((0,0))
    tile.set_colorkey(colorkey, RLEACCEL)

    y = SCREEN_SIZE[1] / 2
    x = SCREEN_SIZE[0] / 2

    for _ in xrange(50):
        screen.blit(tile, (x,y))
        x -= 7
        y -= 14

我看不出代码有什么问题,它可以工作(忽略磁贴没有在正确的位置进行 blit 的事实),但是没有回溯,关闭它的唯一方法是终止 python 进程在任务管理器中。谁能发现我的代码有问题?

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    如果您从 IDLE 运行它,那么您缺少 pygame.quit()

    这是由 IDLE python 解释器引起的,它似乎以某种方式保留了引用。确保在退出应用程序或游戏时调用 pygame.quit()。

    见:In IDLE why does the Pygame window not close correctly?

    还有:Pygame Documentation - pygame.quit()

    【讨论】:

    • PyScripter 也是如此。非常感谢!
    【解决方案2】:

    你从哪里退出外循环?

     while True: # outer loop
         for event in pygame.event.get(): # inner loop
             if event.type == QUIT:
                break # <- break inner loop
    

    【讨论】:

    • 是的,程序的结构好像坏了。我很惊讶这样的程序会产生任何输出。事实上,我怀疑这是 OP 的实际代码。
    【解决方案3】:

    我遇到了同样的问题,但通过执行以下操作解决了它:

    try:
       while True:
          for event in pygame.event.get():
             if event.type==QUIT or pygame.key.get_pressed()[K_ESCAPE]:
                pygame.quit()
                break
    finally:
       pygame.quit()
    

    【讨论】:

      【解决方案4】:

      'if event.type==QUIT' 会产生语法错误。应该是 == pygame.QUIT 此外,该行的其余部分不正确,但我看不出如何。 有一个更干净的变体here

          running = True
          while running:
             for event in pygame.event.get():
                 if event.type == pygame.QUIT:
                 running = False
          pygame.quit()
      

      【讨论】:

      • 使用from pygame.locals import *,OP 在全局命名空间中有QUIT,因此没有语法错误。
      【解决方案5】:

      我在知道为什么我不能关闭 pygame 窗口时遇到了类似的问题.. 并搜索了.. 并遇到了这个..

      我认为这解释了一切……而且也是个好主意……

      见于:http://bytes.com/topic/python/answers/802028-pygame-window-not-closing-tut-not-helping

      我认为问题在于你是 从 IDLE 中运行它。它看起来 像 pyGame 的事件循环和 Tkinter 的 事件循环相互干扰。 如果您从 命令行,它可以工作。

      【讨论】:

      • 可以在IDLE下运行,但代码需要稍作修改
      猜你喜欢
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多