Я учусь использовать 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.
Ответ 2 · рейтинг 10 · iKlsR
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 здесь.
Ответ 3 · рейтинг 3 · DistantQuasar
Я решил эту проблему, и правильный код ниже:
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.
Ответ 4 · рейтинг 1 · Timothy Lawman
Я читал в некоторых источниках, что существует конфликт между mainloop () в Tkinter, который запускает оболочку Python, и Pygame.init (), за которым следует команда sys.exit ().
Было предложено запустить игру из командной строки, чтобы обойти проблему, а не загружать игру с помощью команды "запустить" (F5) из оболочки.
Хорошим побочным эффектом этого было то, что в моей игре "Космические захватчики", в которой происходит много обновлений переменных: 35 раз в секунду, анимация работала правильно, тогда как из оболочки она работала плохо и рывками.
Если я использую следующий код:
if event.type == QUIT:
pygame.quit()
sys.exit()
игра завершается правильно, но оставляет сообщение об ошибке в оболочке, которое не влияет на игру и в значительной степени является избыточным. Это просто немного некрасиво. Этого не происходит из командной строки.
Резюме: попробуйте запустить игру из командной строки, чтобы избежать проблем с Tkinter
Ответ 5 · рейтинг 1 · Mehedi
Если проблема не исчезла, (после разрыва цикла) попробуйте использовать 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)