Проблема с sys.exit () в pygame

Я учусь использовать Pygame, и когда я использую sys.exit(), я сталкиваюсь с проблемой. Вот код:

import pygame, sys,os
from pygame.locals import * 

pygame.init() 

window = pygame.display.set_mode((468, 60)) 
pygame.display.set_caption('Game') 
screen = pygame.display.get_surface() 

file_name = os.path.join("data","image.bmp")

surface = pygame.image.load(file_name)

screen.blit(surface, (0,0)) 
pygame.display.flip() 

def input(events): 
   for event in events: 
      if event.type == QUIT: 
         sys.exit(0) 
      else: 
         print event 

while True: 
   input(pygame.event.get()) 

На самом деле это просто код из учебника по pygame. Проблема возникает, когда я действительно пытаюсь выйти, независимо от того, какое событие я пытаюсь использовать для sys.exit().

Traceback (most recent call last):
  File "C:/Python27/Lib/site-packages/pygame/examples/test.py", line 25, in <module>
    input(pygame.event.get())
  File "C:/Python27/Lib/site-packages/pygame/examples/test.py", line 20, in input
    sys.exit(0)
SystemExit: 0

... И тогда программа не выходит. Что я здесь делаю не так? Потому что я заметил, что этот код предназначен для устаревшей версии Python.


person YamSMit    schedule 14.07.2012    source источник


Ответы (5)


sys.exit просто генерирует исключение (исключение SystemExit). Это имеет два необычных эффекта:

  1. Выходит только из текущего потока в многопоточном приложении.
  2. Исключение можно было поймать.
person Neil    schedule 14.07.2012

sys.exit() 

Само по себе это немного нечестиво с pygame ... правильный способ выйти из приложения pygame - сначала выйти из основного цикла, затем выйти из pygame, а затем выйти из программы. т.е.

while running == True:
    # catch events
    if event_type == quit:
        running = False  # breaks out of the loop

pygame.quit()  # quits pygame
sys.exit()

также мне кажется, что вы не ловите событие должным образом .. это должно быть

if event.type == pygame.QUIT:

вы можете узнать больше о событиях в pygame здесь.

person iKlsR    schedule 15.07.2012
comment
мне также кажется, что вы неправильно улавливаете событие: нет, он импортирует pygame.locals, так что event.type == QUIT полностью в порядке. Но ваш ответ правильный: вы должны сначала просто выйти из основного цикла. - person sloth; 15.07.2012
comment
Это ответ, когда я изучаю pygame, это избавило меня от много головной боли. - person eric; 29.06.2017

Я решил эту проблему, и правильный код ниже:

running = True
while running == True:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False  # Exiting the while loop

    screen.blit(background, (0,0))
    pygame.display.update()

pygame.quit() # Call the quit() method outside the while loop to end the application.
person DistantQuasar    schedule 13.06.2013

Я читал в некоторых источниках, что существует конфликт между mainloop () в Tkinter, который запускает оболочку Python, и Pygame.init (), за которым следует команда sys.exit ().

Было предложено запустить игру из командной строки, чтобы обойти проблему, а не загружать игру с помощью команды «запустить» (F5) из оболочки.

Хорошим побочным эффектом этого было то, что в моей игре «Космические захватчики», в которой происходит много обновлений переменных: 35 раз в секунду, анимация работала правильно, тогда как из оболочки она работала плохо и рывками.

Если я использую следующий код:

if event.type == QUIT:
    pygame.quit()
    sys.exit()

игра завершается правильно, но оставляет сообщение об ошибке в оболочке, которое не влияет на игру и в значительной степени является избыточным. Это просто немного некрасиво. Этого не происходит из командной строки.

Резюме: попробуйте запустить игру из командной строки, чтобы избежать проблем с Tkinter

person Timothy Lawman    schedule 22.10.2012

Если проблема не исчезла, (после разрыва цикла) попробуйте использовать sys.exit(0) вместо sys.exit(). Надеюсь, это поможет. У меня это сработало. Кажется, pygame ожидает, что аргумент status (т.е. 0 здесь) будет передан явно.

См. Пример ниже:

isRunning = True
while isRunning:
# Catch events
if event.type == pygame.QUIT:
    isRunning = False # Breaks the loop

pygame.quit()
sys.exit(0)
person Mehedi    schedule 13.07.2020