Программы Pygame зависают при выходе

Я сейчас работаю с 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

Я не вижу ничего плохого в коде, он работает (не обращайте внимания на то, что тайл не бликует в нужных местах), но трассировки нет, и единственный способ закрыть ее — убить процесс python в диспетчере задач. . Может ли кто-нибудь обнаружить проблему с моим кодом?


person Enrico Tuvera Jr    schedule 08.01.2010    source источник


Ответы (5)


Если вы запускаете его из IDLE, вам не хватает pygame.quit().

Это вызвано интерпретатором IDLE python, который, кажется, каким-то образом сохраняет ссылки. Убедитесь, что вы вызываете pygame.quit() при выходе из приложения или игры.

См.: Почему в IDLE окно Pygame не закрывается корректно?

А также: Документация по Pygame — pygame.quit()

person Reshure    schedule 08.01.2010
comment
То же самое для PyScripter. Большое спасибо! - person Anatoly Scherbakov; 25.11.2013

Где вы выходите из внешнего цикла?

 while True: # outer loop
     for event in pygame.event.get(): # inner loop
         if event.type == QUIT:
            break # <- break inner loop
person jfs    schedule 08.01.2010
comment
Да, структура программы кажется нарушенной. Я очень удивлен, что такая программа вообще выдает какие-либо результаты. На самом деле, я подозреваю, что это настоящий код ОП. - person Kylotan; 08.01.2010

У меня была такая же проблема, но я решил ее, выполнив следующие действия:

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()
person mechanicarts    schedule 11.04.2012

'if event.type==QUIT' генерирует синтаксическую ошибку. Должно быть == pygame.QUIT Кроме того, остальная часть строки неверна, но я не понимаю, как это сделать. Есть более чистый вариант здесь:

    running = True
    while running:
       for event in pygame.event.get():
           if event.type == pygame.QUIT:
           running = False
    pygame.quit()
person Nik    schedule 28.05.2012
comment
С from pygame.locals import * OP имеет QUIT в глобальном пространстве имен, поэтому синтаксической ошибки нет. - person bstpierre; 28.11.2012

У меня была аналогичная проблема, когда я узнал, почему я не могу закрыть окна pygame... и искал... и наткнулся на это...

Думаю, это все объясняет.. и идея тоже хорошая..

как показано в: http://bytes.com/topic/python/answers/802028-pygame-window-not-closing-tut-not-helping

Я думаю, проблема в том, что вы запускаете его из IDLE. Похоже, цикл событий pyGame и цикл событий Tkinter мешают друг другу. Если запускать скрипты из командной строки, то работает.

person ihightower    schedule 12.01.2011
comment
Его можно запустить в IDLE, но код нуждается в небольших изменениях. - person ReinstateMonica3167040; 13.03.2018