Создание новогодней ёлки с гирляндой: тёмная сцена, снег и звезда | Часть 1
22.12.2025
Время чтения: 10-15 минут
Что нас ждёт
Если ты когда-нибудь думал, что программирование — это сплошные сухие формулы, серые окна и тоска, то у меня хорошие новости. Прямо сейчас мы шаг за шагом соберём настоящую новогоднюю сцену: тёмный вечер, падающий снег и ёлку со звездой на макушке.
Никакой магии, странных библиотек и «шаманских» приёмов — только Python и Tkinter. Это стандартная библиотека, которая умеет создавать окна и рисовать в них всё, что душе угодно.
После нашей серии статей у вас получится вот такая ёлочка:

Подготовка сцены: импорты, палитра и закрытие окна
Начинаем с трёх подключений: tkinter даст окно и холст для рисования, random пригодится дальше (пусть лежит рядом, как коробка с гирляндой), а time поможет делать паузы, чтобы цикл не пытался рисовать 200 тысяч раз в секунду.
import tkinter as tk # tk — модуль для окон, Canvas и кнопок
import random # random — чтобы выбирать случайные цвета
import time # time — чтобы в while-цикле не грузить CPU
Дальше готовим “краски”. Да, это просто строки с цветами, но они задают настроение всей сцене. Хороший бонус: по ним легко менять стиль, не лазая по всему файлу.
# --- цвета ---
orange_color = "#f15a31" # оранжевый
green_color = "#00b259" # зелёный
purple_color = "#bd56a0" # фиолетовый
white_color = "#ffffff" # белый
red_color = "#ff2400" # красный
blue_color = "#0000ff" # синий
yellow_clor = "#edff21" # желтый
snow_color = "#cdced5" # грязный белый
night_color = "#101828" # ночной фон
Мы заведём флаг running — это как “пульс программы”. Пока он True — окно живёт. Нажали крестик — мы вежливо выключаем пульс и закрываем окно.
# --- Состояние ---
running = True # флаг для while-цикла окна
Холст и геометрия ёлки: фон, сама ёлка и снег
Для начала создадим главное окно программы без которого у нас ничего не появится.
# --- Окно и Canvas (главный поток кода, без main()) ---
root = tk.Tk() # root — главное окно программы
root.title("Гирлянда на ёлочке — 5 минут") # заголовок окна
Вот как оно будет выглядеть:

Нам нужен “лист бумаги”, на котором будет сцена. В Tkinter это Canvas — холст. Также задаём размеры и тёмный фон.
w = 900 # w — ширина Canvas
h = 540 # h — высота Canvas
# --- Canvas ---
canvas = tk.Canvas(root, width=w, height=h, bg=night_color) # Canvas — лист для рисования
canvas.pack() # pack размещает Canvas в нашем окне root

Чтобы ёлка была симметричной и не сдвигалась чётко зафиксируем её положение и размер, берём центр холста по X, задаём Y макушки, высоту и ширину основания. Это не сухие “переменные ради переменных”, а параметры, которые держат форму.
# --- Рисуем ёлку (простая геометрия) ---
cx = w // 2 # cx — центр ёлки по X
top_y = 65 # top_y — верхушка ёлки (счёт идёт сверху вниз)
tree_h = 350 # tree_h — высота ёлки
base_w = 460 # base_w — ширина основания ёлки
Ёлка — треугольник. В Canvas треугольник удобно рисовать create_polygon: даём точки подряд, получаем залитую фигуру. Контур отключаем, чтобы не выглядело как дорожный знак “Осторожно, ёлка”.
Для того чтобы не запутаться в точках и координатах вот картинка на которой подписаны почти все точки для нашей ёлки:

canvas.create_polygon(
cx, top_y, # верхний угол
cx - base_w // 2, top_y + tree_h, # нижний левый угол
cx + base_w // 2, top_y + tree_h, # нижний правый угол
fill=green_color, # зелёная ёлка фирменным цветом
outline="" # отключаем контур
)
Добавляем ствол прямоугольником с помощью create_rectangle, он создает прямоугольник по 2 противоположенным его углом.
canvas.create_rectangle(
cx - 45, top_y + tree_h,
cx + 45, top_y + tree_h + 90,
fill=orange_color, # ствол оранжевым цветом
outline=""
)
И кладём снег внизу — ещё один прямоугольник. Он сразу делает сцену законченной: появляется “земля”, а не пустота.
canvas.create_rectangle(
4, top_y + tree_h + 90,
w, h-1,
fill=snow_color, # делаем снежную платформу
outline=""
)
Вот тут уже видно сцену: фон, ёлка, ствол и снег. Всё хорошо но чего то не хватает…

Финальный штрих — звезда и цикл обновления окна
Теперь — последнее дополнение для этой части: звезда. Мы не используем картинки, поэтому рисуем её многоугольником. Логика простая: точки чередуются “дальняя — ближняя”, и получается узнаваемая звёздочка. Для этого нам понадобится целых 10 точек!
Первые 6 рисуют сверху вниз правую половину. А остальные 4 точки это первые точки, отраженные относительно вертикали.
Вот первые 3 точки:

Это первые 6 точек:

А вот и код для целой звезды. Можно заметить что после cx, top_y + 14 идут те же точки но с измененными знаками у x на противоположные. Это и даёт нам симметрию звезды:
# --- Звезда на макушке ---
canvas.create_polygon(
cx, top_y - 36,
cx + 12, top_y - 12, cx + 36, top_y - 12,
cx + 18, top_y + 4, cx + 24, top_y + 28,
cx, top_y + 14,
cx - 24, top_y + 28, cx - 18, top_y + 4,
cx - 36, top_y - 12, cx - 12, top_y - 12,
fill=yellow_clor,
outline=""
)
Осталось удерживать окно “живым”. Тут у нас ручной пульс: root.update() обрабатывает события, а sleep нужен для установки частоты обновления, он не даёт циклу превратить ноутбук в обогреватель.
# --- Главный while-цикл (пока просто держим окно живым) ---
while running:
root.update()
time.sleep(0.02)
Теперь ёлка выглядит как готовая сцена: можно честно сказать “первая версия новогодней ёлки готова”.

Собираем всё вместе
import tkinter as tk # tk — модуль для окон, Canvas и кнопок
import random # random — чтобы выбирать случайные цвета
import time # time — чтобы в while-цикле не грузить CPU
# --- Состояние ---
running = True # флаг для while-цикла окна
# --- цвета ---
orange_color = "#f15a31" # оранжевый
green_color = "#00b259" # зелёный
purple_color = "#bd56a0" # фиолетовый
white_color = "#ffffff" # белый
red_color = "#ff2400" # красный
blue_color = "#0000ff" # синий
yellow_clor = "#edff21" # желтый
snow_color = "#cdced5" # грязный белый
night_color = "#101828" # ночной фон
# --- Окно и Canvas (главный поток кода, без main()) ---
root = tk.Tk() # root — главное окно программы
root.title("Гирлянда на ёлочке — 5 минут") # заголовок окна
w = 900 # w — ширина Canvas (используем несколько раз)
h = 540 # h — высота Canvas (используем несколько раз)
# --- Canvas ---
canvas = tk.Canvas(root, width=w, height=h, bg=night_color) # Canvas — “лист” для рисования
canvas.pack() # pack размещает Canvas в окне
# --- Рисуем ёлку (простая геометрия) ---
cx = w // 2 # cx — центр ёлки по X
top_y = 65 # top_y — верхушка ёлки (счёт идёт сверху вниз)
tree_h = 350 # tree_h — высота ёлки
base_w = 460 # base_w — ширина основания ёлки
canvas.create_polygon(
cx, top_y, # верхний угол
cx - base_w // 2, top_y + tree_h, # нижний левый угол
cx + base_w // 2, top_y + tree_h, # нижний правый угол
fill=green_color, # зелёная ёлка фирменным цветом
outline="" # отключаем контур
)
# --- Звезда на макушке ---
canvas.create_polygon(
cx, top_y - 36,
cx + 12, top_y - 12, cx + 36, top_y - 12,
cx + 18, top_y + 4, cx + 24, top_y + 28,
cx, top_y + 14,
cx - 24, top_y + 28, cx - 18, top_y + 4,
cx - 36, top_y - 12, cx - 12, top_y - 12,
fill=yellow_clor,
outline=""
)
canvas.create_rectangle(
cx - 45, top_y + tree_h,
cx + 45, top_y + tree_h + 90,
fill=orange_color, # ствол оранжевым цветом
outline=""
)
canvas.create_rectangle(
4, top_y + tree_h + 90,
w, h-1,
fill=snow_color, # делаем снежную платформу
outline=""
)
# --- Главный while-цикл (пока просто держим окно живым) ---
while running:
root.update()
time.sleep(0.02)
