Pygame: установка, игровой цикл и проверка первого кадра
Автор: Казачкин Даниил Михайлович · Обновлено
Установка Pygame полезна, когда за ней следует проверяемая задача: открыть окно, обработать события, нарисовать кадр и корректно завершить программу. В этом практикуме вы соберёте маленькую анимацию и сохраните её последний кадр в PNG. Так проверяются и импорт библиотеки, и её взаимодействие с видеоподсистемой.
Установка Pygame в выбранный Python
Создайте отдельную папку и окружение по уроку [Python venv](/lessons/python/python-developer-intermediate/python-intermediate-01). После активации выполните:
python -m pip install pygame
python -m pip show pygameНа Windows можно обойтись без активации: сначала py -3 -m venv .venv, затем .\.venv\Scripts\python.exe -m pip install pygame. Команда скачает совместимый пакет из настроенного индекса; отдельный случайный установщик «pygame для Windows» не нужен. Официальная страница пакета — Pygame на PyPI. Проверка этого урока выполнена с Pygame 2.6.1 и Python 3.13 в Linux; наличие wheel для вашей версии Python и архитектуры нужно проверять отдельно.
Окно, события и кадры
Сохраните pygame_loop.py рядом с окружением:
import os
import sys
headless = "--headless" in sys.argv
if headless:
os.environ["SDL_VIDEODRIVER"] = "dummy"
os.environ["PYGAME_HIDE_SUPPORT_PROMPT"] = "1"
import pygame
pygame.display.init()
screen = pygame.display.set_mode((320, 180))
clock = pygame.time.Clock()
frames = 0
running = True
try:
while running and frames < 60:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if not running:
break
screen.fill((15, 22, 35))
pygame.draw.circle(screen, (70, 190, 240), (20 + frames * 3, 90), 12)
pygame.display.flip()
frames += 1
if not headless:
clock.tick(60)
pygame.image.save(screen, "frame.png")
print("Кадров:", frames)
print("Размер:", pygame.image.load("frame.png").get_size())
finally:
pygame.quit()Запуск python pygame_loop.py показывает движущийся голубой круг. Программа обрабатывает событие закрытия окна, очищает поверхность перед новой отрисовкой и завершает цикл после 60 кадров. Если окно не закрывать раньше, результат:
Кадров: 60
Размер: (320, 180)В папке появляется frame.png. Полный цикл ограничен числом кадров, поэтому программа не остаётся работающей навсегда. Работа окна и обновление поверхности описаны в pygame.display, рисование окружности — в pygame.draw.
Что проверяет запуск без окна
Команда python pygame_loop.py --headless использует SDL dummy driver. Она удобна для автоматической проверки создания поверхности и PNG на машине без рабочего стола. Это не проверка настоящего окна, клавиатуры или видеодрайвера Windows. Локально исполнен именно этот вариант; его результат — 60 кадров и изображение размером 320×180.
Уберите screen.fill(...) и сравните рисунок: старые положения круга останутся на поверхности. Этот опыт отделяет изменение координаты от полной перерисовки сцены. В обычном режиме clock.tick(60) ограничивает частоту цикла; конкретная длительность зависит от системы, а не гарантированного таймера. pygame.time.
Разбор ошибок
ModuleNotFoundError: pygame: сопоставьте интерпретатор запуска сpython -m pip --version. Проверьте, нет ли рядом вашего файлаpygame.py.- Ошибка поиска дистрибутива или попытка сборки исходников: проверьте версию Python, разрядность и доступные файлы релиза на PyPI. Изменение имени команды
pipне создаёт отсутствующий wheel. - Ошибка видеоустройства: сначала запустите headless-вариант. Если PNG создаётся, установка Python-пакета работает, а проблема относится к графической среде.
Практика: движение с границами
Добавьте переменную направления и разворачивайте круг, когда он достигает правой или левой границы с учётом радиуса. Затем удвойте число кадров. Для проверки используйте три начальных положения: у левого края, в середине и у правого. Центр не должен выходить за интервал от 12 до 308.
Объясните, почему простое удвоение скорости не эквивалентно удвоению кадров. Сдайте код, итоговый PNG и описание поведения при раннем закрытии окна. Успешный импорт — только первый этап; готовность этого примера подтверждается обработкой событий, сохранением кадра и штатным завершением.