Окно Pygame не отвечает через несколько секунд

Этот простой фрагмент кода вылетает (окно не отвечает) через несколько секунд (около 5).

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 24)
#clock = pygame.time.Clock()

#font = pygame.font.Font(None, 32)

cycles = 0
while True:
    screen.fill(0)
#    text = font.render('Cycles : %d' % cycles, True, (255, 255, 255))
#    screen.blit(text, (100, 100))

    cycles += 1

    pygame.display.update()

Если я раскомментирую закомментированные строки, я ясно вижу, что программа выходит из-под контроля при отображении значений между 47 и 50.

Я использую Python 2.7 и Pygame 1.9.2, Windows 8 (64 бит) и Eclipse + PyDev.

2 ответа

Решение

Вызов pygame.event.get() в начале цикла while.

Вам необходимо регулярно совершать вызов одной из четырех функций в pygame.event модуль для внутреннего взаимодействия Pygame с вашей ОС. В противном случае ОС будет думать, что ваша игра потерпела крах. Поэтому убедитесь, что вы называете один из них:

  • pygame.event.get() возвращает список всех событий, находящихся в данный момент в очереди событий.
  • pygame.event.poll() возвращает одно событие из очереди событий или pygame.NOEVENT если очередь пуста
  • pygame.event.wait() возвращает одно событие из очереди событий или ожидает, пока событие не будет возвращено.
  • pygame.event.pump() позволяет Pygame обрабатывать внутренние действия. Полезно, когда вы не хотите обрабатывать события из очереди событий.

Окно замирает, потому что вы не обрабатываете события. Вы должны обрабатывать события либо pygame.event.pump() или pygame.event.get(), чтобы окно продолжало реагировать.

См. Документацию pygame.event.pump():

Для каждого кадра вашей игры вам нужно будет сделать какой-то вызов очереди событий. Это гарантирует, что ваша программа может внутренне взаимодействовать с остальной частью операционной системы.

Добавьте цикл событий, например:

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

    # [...]

Как вариант просто прокачать события:

while True:
    pygame.event.pump()

    # [...]
Другие вопросы по тегам