Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: YamSMitОтветов: 5

Я учусь использовать 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.

pygamepython

Ответы

Ответ 1 · рейтинг 4 · Neil

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

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

Ответ 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)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы