Окно в PyGame создаётся тремя вызовами: pygame.init() включает библиотеку, pygame.display.set_mode((800, 600)) открывает окно размером 800 × 600 пикселей, а pygame.display.set_caption() задаёт текст в заголовке. Чтобы окно не схлопнулось сразу после запуска, нужен игровой цикл: while, который обрабатывает события и перерисовывает кадр. Ниже вы найдёте минимальный рабочий код, проверенный на PyGame 2.6.1, и разбор каждой строки. Если вы пока выбираете, на чём делать первую игру, загляните в наш гайд по разработке игр для новичков: PyGame там разобран в сравнении с другими движками.
Установка PyGame: одна команда
PyGame ставится через pip, как любая библиотека Python. Откройте терминал и выполните:
pip install pygame
Если на компьютере несколько версий Python, надёжнее вызывать pip через конкретный интерпретатор: python -m pip install pygame. Тогда библиотека точно попадёт туда, откуда вы запускаете скрипты.
Проверить установку можно прямо из консоли Python:
>>> import pygame
pygame 2.6.1 (SDL 2.32.70, Python 3.14.3)
Hello from the pygame community. https://www.pygame.org/contribute.html
>>> pygame.ver
'2.6.1'
Приветствие «Hello from the pygame community» при первом импорте печатает сама библиотека, это норма. Если видите эти строки, PyGame установлен и готов к работе. Если же pip падает с ошибкой, загляните в отдельную инструкцию, как установить PyGame: там разобраны типовые проблемы с версиями Python.
Готовый код первого окна в PyGame
Скопируйте код в файл main.py и запустите: откроется тёмное окно с заголовком «Моя первая игра», которое закрывается крестиком. Это скелет, с которого начинается практически любой проект на PyGame.
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Моя первая игра")
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((30, 30, 40))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Что здесь происходит по шагам:
import pygameподключает библиотеку. Если строка падает с ошибкой, вернитесь к разделу про установку.pygame.init()инициализирует все модули библиотеки: дисплей, звук, шрифты.pygame.display.set_mode((800, 600))создаёт окно и возвращает поверхностьscreen, на которой мы будем рисовать.pygame.display.set_caption("Моя первая игра")подписывает окно.- Цикл
while runningкаждый кадр читает события, заливает фон цветом, показывает картинку и ограничивает частоту 60 кадрами в секунду. pygame.quit()корректно выгружает библиотеку после выхода из цикла.
Что делает каждая функция
pygame.init()
Функция запускает все подсистемы PyGame разом и возвращает кортеж из двух чисел: сколько модулей инициализировалось успешно и сколько с ошибкой. Проверять результат в учебных проектах необязательно: если дисплей поднялся, остальное почти всегда в порядке.
Вызывать pygame.init() нужно один раз в начале программы, до работы с экраном, звуком и шрифтами. Повторные вызовы безопасны, уже включённые модули они не трогают. Существует и точечный вариант pygame.display.init(), который поднимает только дисплей, но на старте проще включить всё сразу общим pygame.init().
pygame.display.set_mode()
Главный аргумент функции — кортеж (ширина, высота) в пикселях: сначала width, затем height. Возвращает она объект Surface, экранную поверхность. Всё, что вы нарисуете на ней, попадёт на монитор после вызова pygame.display.flip(). Переменную с этой поверхностью традиционно называют screen: это соглашение вы встретите почти в каждом туториале.
Вторым аргументом можно передать флаги режима окна:
| Флаг | Что делает |
|---|---|
pygame.FULLSCREEN |
Разворачивает игру на весь экран без рамки окна |
pygame.RESIZABLE |
Разрешает тянуть окно за края; при изменении размера приходит событие VIDEORESIZE |
pygame.NOFRAME |
Убирает рамку и кнопки управления окном |
pygame.SCALED |
Масштабирует картинку под разрешение монитора, полезно для пиксель-арта |
Есть и удобный трюк: вызов set_mode((0, 0)) создаёт окно размером с текущее разрешение экрана, узнавать его заранее не придётся. Флаги комбинируются через вертикальную черту: pygame.display.set_mode((0, 0), pygame.FULLSCREEN).
pygame.display.set_caption()
Принимает строку и выводит её в заголовок окна. Кириллица работает без дополнительных настроек. Если функцию не вызывать, окно получит подпись по умолчанию «pygame window».
Игровой цикл: почему без него окно закрывается
Если оставить только init() и set_mode(), окно мелькнёт и исчезнет: скрипт дошёл до конца файла, Python завершил процесс, вместе с ним закрылось и окно. Поэтому нужен бесконечный цикл, который не даёт программе завершиться. Как устроен сам оператор, мы подробно разбирали в статье про цикл while в Python.
Внутри цикла каждую итерацию, то есть каждый кадр, происходят три вещи:
- Обработка событий.
pygame.event.get()забирает из очереди всё, что случилось: клики, нажатия клавиш, закрытие окна. Событиеpygame.QUITприходит по клику на крестик, по нему мы выставляемrunning = Falseи выходим из цикла. - Отрисовка.
screen.fill((30, 30, 40))заливает фон цветом в формате RGB, поверх него вы позже будете рисовать спрайты.pygame.display.flip()выводит готовый кадр на монитор, до этого вызова все изменения существуют только в памяти. - Контроль частоты кадров.
clock.tick(60)притормаживает цикл так, чтобы он крутился не быстрее 60 раз в секунду. Без этого игра выжмет из процессора все 100% и будет работать с разной скоростью на разных компьютерах.
Кроме flip() существует pygame.display.update(): ему можно передать прямоугольник или список прямоугольников, и он перерисует только их. На первых проектах разница незаметна, начинайте с flip(), он проще и обновляет весь экран целиком.
Шаблон посильнее: константы, выход по Esc и первая фигура
Магические числа вроде (800, 600) прямо в вызовах быстро превращают код в кашу. Размеры окна, частоту кадров и цвета принято выносить в константы в начале файла: поменять разрешение тогда можно одной строкой.
import pygame
WIDTH, HEIGHT = 800, 600
FPS = 60
BG_COLOR = (30, 30, 40)
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Моя первая игра")
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
running = False
screen.fill(BG_COLOR)
pygame.draw.circle(screen, (255, 200, 0), (WIDTH // 2, HEIGHT // 2), 50)
pygame.display.flip()
clock.tick(FPS)
pygame.quit()
Что добавилось по сравнению с минимальным скелетом:
- Константы
WIDTH,HEIGHT,FPS. Размеры и частота кадров задаются в одном месте и переиспользуются по всему коду, например в расчёте центра экрана. - Выход по Esc. Событие
pygame.KEYDOWNприходит при нажатии любой клавиши, аevent.key == pygame.K_ESCAPEотбирает именно Escape. Удобно на этапе отладки, когда окно запускается десятки раз. - Первая фигура.
pygame.draw.circle()рисует жёлтый круг радиусом 50 пикселей в центре окна. Координаты центра считаются из констант:WIDTH // 2иHEIGHT // 2.
Этот шаблон уже можно развивать до игры: заменить круг на спрайт, повесить движение на стрелки, добавить счёт. Структура цикла при этом не меняется: события, логика, отрисовка.
Как изменить размер окна после запуска
Размер, заданный в set_mode(), не приговор. Есть два способа его поменять уже в работающей программе.
Способ 1: повторный вызов set_mode(). Функцию можно вызывать сколько угодно раз, каждый вызов пересоздаёт окно с новыми параметрами. Так обычно делают переключение между оконным и полноэкранным режимом по горячей клавише.
Способ 2: флаг RESIZABLE плюс обработка события. Когда пользователь тянет окно за край, PyGame присылает событие VIDEORESIZE с новыми размерами в атрибутах event.w и event.h:
screen = pygame.display.set_mode((640, 480), pygame.RESIZABLE)
...
for event in pygame.event.get():
if event.type == pygame.VIDEORESIZE:
screen = pygame.display.set_mode((event.w, event.h), pygame.RESIZABLE)
Текущий размер окна в любой момент возвращает screen.get_size(), он отдаёт кортеж (ширина, высота). Удобно распаковать его в две переменные: w, h = screen.get_size(). Разрешение монитора целиком можно узнать через pygame.display.Info(): атрибуты current_w и current_h после создания окна показывают размеры текущей поверхности, а до создания — экрана.
Частые ошибки и как их исправить
Пять ситуаций, с которыми сталкивается почти каждый новичок на первом запуске:
| Симптом | Причина | Решение |
|---|---|---|
ModuleNotFoundError: No module named 'pygame' |
Библиотека не установлена или стоит в другом интерпретаторе | Выполнить python -m pip install pygame тем же Python, которым запускаете скрипт |
| Окно открывается и сразу закрывается | Нет игрового цикла, скрипт дошёл до конца и завершился | Добавить while running с обработкой событий, как в примере выше |
| Окно «Не отвечает», курсор крутится | В цикле нет pygame.event.get(), очередь событий переполняется, и система считает программу зависшей |
Каждый кадр вычитывать события циклом for event in pygame.event.get() |
| Окно есть, но экран чёрный, ничего не рисуется | Забыли pygame.display.flip(), кадр остался в памяти |
Вызывать flip() или update() в конце каждой итерации цикла |
pygame.error: video system not initialized |
Обращение к дисплею после pygame.quit() или до создания окна |
Проверить порядок вызовов: сначала init() и set_mode(), затем работа с экраном, и только в самом конце quit() |
Отдельный совет про имя файла: не называйте свой скрипт pygame.py. Python попытается импортировать ваш же файл вместо библиотеки, и вы получите загадочную ошибку про отсутствие pygame.init.
Где освоить Python системно
Окно и игровой цикл занимают первые 20 строк любой игры, дальше начинаются спрайты, коллизии, звук и архитектура посерьёзнее. Чтобы уверенно расти от скелета до полноценного проекта, понадобится системная база по Python: функции, классы, работа с модулями. Мы собрали каталог курсов по Python с фильтрами по цене и формату, а отдельный roadmap Python-разработчика поможет спланировать путь целиком.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 175 800 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| Разработчик на Python Перейти на сайт курса | 198 000 ₽ | 5500 ₽/мес. | 6 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 666 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | 250 000 ₽/мес. | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




