Коротко: черепашка (turtle) входит в стандартный Python, отдельно ставить её не нужно. Ты пишешь t.forward(100) и t.left(90), а черепашка ползёт по окну и оставляет линию. Ниже шпаргалка команд и 10 рисунков от квадрата до ночного города. Каждый код мы запустили, и рядом с каждым написано, что получится и что изменится, если поменять одно число.

Большинство фигур держится на одном правиле, и ты увидишь его почти в каждом примере: чтобы замкнуть фигуру с n одинаковыми сторонами, черепашка должна в сумме повернуться на 360°. Отсюда 90 для квадрата, 120 для треугольника, 60 для шестиугольника.

Шпаргалка команд turtle

Все примеры начинаются с import turtle и t = turtle.Turtle(). Дальше t и есть твоя черепашка, команды ей пишутся через точку.

КомандаЧто делает
t.forward(100)вперёд на 100 пикселей с линией; t.backward(100) назад
t.left(90), t.right(90)поворот на месте влево или вправо на 90°
t.penup(), t.pendown()поднять перо (ходить без следа) и опустить
t.goto(x, y)перейти в точку; центр окна — (0, 0)
t.color("red", "yellow")цвет линии и заливки; один цвет идёт на оба
t.begin_fill() … t.end_fill()закрасить фигуру, нарисованную между ними
t.circle(50)круг радиусом 50; t.circle(50, 90) только четверть круга
t.speed(0)скорость: 1 медленно, 10 быстро, 0 быстрее всего
t.width(3)толщина линии
t.dot(10)точка диаметром 10
turtle.bgcolor("black")цвет фона
turtle.done()последняя строка, держит окно открытым

x растёт вправо, y вверх. На старте черепашка в центре и смотрит вправо. Цвета — английские названия ("orange", "skyblue") или коды вроде "#0057B7".

Как запустить и почему окно сразу исчезает

Проще всего запускать в IDLE: он уже есть у тебя, если Python ставили с python.org. File → New File, вставить код, сохранить, F5. В VS Code то же делает кнопка ▶ вверху справа (нужно расширение Python). Python у тебя ещё не стоит? Вот установка на Windows.

Без turtle.done() в конце программа завершится и заберёт окно с собой: из VS Code или терминала рисунок мелькнёт на долю секунды. done() держит окно, пока ты не закроешь его сам. В IDLE окно иногда остаётся и так, потому что IDLE не выключает Python после запуска. Но привычка одна: done() всегда последней строкой.

Ещё две ловушки первого дня:

  • Твой файл называется turtle.py. Тогда import turtle подтягивает твой же файл, и Python пишет AttributeError: partially initialized module 'turtle' has no attribute 'Turtle'. Переименуй файл, скажем, в risunok.py.
  • ModuleNotFoundError: No module named 'tkinter'. Черепашка рисует через tkinter, а у тебя его не поставили. На Windows переустанови Python с галочкой «tcl/tk and IDLE», на Linux добавь пакет python3-tk.

10 рисунков: от квадрата до ночного города

Каждый пример — отдельная программа. Копируй весь код, от import до done(): без первой строки Python не будет знать, что такое turtle.

1. Квадрат

import turtle

t = turtle.Turtle()
t.shape("turtle")
t.width(3)

for _ in range(4):
    t.forward(100)   # сторона — 100 шагов
    t.left(90)       # 360 / 4 = 90

turtle.done()

Что получится: чёрный квадрат 100 × 100, левый нижний угол в центре окна, линия толщиной 3. После четвёртого поворота черепашка там, откуда начала, и снова смотрит вправо.

Измени одно число: 90 на 120. Выйдет треугольник, а четвёртая сторона ляжет поверх первой. Как range(4) считает повторы, тебе расскажет статья о цикле for.

2. Пятиконечная звезда

import turtle

t = turtle.Turtle()
t.width(3)
t.color("orange")

for _ in range(5):
    t.forward(150)
    t.right(144)     # 5 × 144 = 720 — два полных оборота

turtle.done()

Что получится: оранжевая звезда, каждая линия 150 пикселей. Почему 144? За пять поворотов черепашка обходит круг дважды: 5 × 144 = 720. Поэтому линии и пересекаются.

Здесь два числа вместе: 144 на 170 и 5 на 36. Получится вспышка из 36 острых лучей, и она тоже замкнётся: 36 × 170 = 6120, ровно 17 оборотов. Для семиконечной звезды тебе понадобится range(7) и угол 180 - 180 / 7.

3. Квадратная спираль

import turtle

t = turtle.Turtle()
t.speed(0)           # 0 — быстрее всего
t.color("teal")

size = 5
for _ in range(50):
    t.forward(size)
    t.left(91)       # на 1 градус больше, чем у квадрата
    size += 3        # каждая следующая сторона длиннее на 3

turtle.done()

Что получится: бирюзовая спираль из 50 отрезков, от 5 до 152 пикселей, в целом около 210 × 210. Лишний градус сдвигает каждый виток, и спираль закручивается вихрем.

Измени одно число: с 90 у тебя выйдет ровный квадратный «лабиринт» без закрутки, со 121 — закрученная треугольная спираль.

4. Узор: цикл в цикле

import turtle

t = turtle.Turtle()
t.speed(0)
t.color("purple")

for _ in range(12):        # 12 квадратов
    for _ in range(4):     # один квадрат
        t.forward(80)
        t.left(90)
    t.left(30)             # 360 / 12 = 30

turtle.done()

Что получится: фиолетовая розетка из 12 квадратов 80 × 80 с общей вершиной в центре, около 220 × 220. Внутренний цикл рисует квадрат, внешний повторяет его 12 раз: 48 линий из восьми строк.

Измени одно число: 30 на 20. Квадраты покроют только 12 × 20 = 240° из 360, и сбоку появится пустой сектор.

5. Домики с функциями

import turtle

t = turtle.Turtle()
t.speed(0)

def go(x, y):              # перейти, не оставляя следа
    t.penup()
    t.goto(x, y)
    t.pendown()

def square(size, color):
    t.color("black", color)
    t.begin_fill()
    for _ in range(4):
        t.forward(size)
        t.left(90)
    t.end_fill()

def triangle(size, color):
    t.color("black", color)
    t.begin_fill()
    for _ in range(3):
        t.forward(size)
        t.left(120)
    t.end_fill()

def house(x, y, size):     # (x, y) — левый нижний угол
    go(x, y)
    square(size, "tan")            # стены
    go(x, y + size)
    triangle(size, "firebrick")    # крыша

house(-200, -50, 80)
house(-60, -50, 110)
house(100, -50, 70)

turtle.done()

Что получится: три домика с песочными стенами и кирпично-красными крышами, размером 80, 110 и 70. Ты пишешь функцию house() один раз и вызываешь трижды. Зачем параметры x, y, size, объясняет справочник по функциям.

Измени одно число: в house(-60, -50, 110) 110 на 160. Средний дом встанет вплотную к правому соседу, а крыша подстроится сама, потому что треугольник берёт тот же size.

6. Солнце с лучами

import turtle

t = turtle.Turtle()
t.speed(0)
turtle.bgcolor("skyblue")

# лучи из центра
t.color("orange")
t.width(4)
for _ in range(12):
    t.forward(120)
    t.backward(120)
    t.left(30)

# диск: круг рисуется от нижней точки, поэтому встаём на радиус ниже центра
t.penup()
t.goto(0, -70)
t.pendown()
t.width(1)
t.color("orange", "yellow")
t.begin_fill()
t.circle(70)
t.end_fill()

turtle.done()

Что получится: на голубом фоне жёлтый диск радиусом 70 и 12 оранжевых лучей. Лучи по 120 идут из центра, диск рисуется позже и закрывает их середину, так что снаружи видно по 50 пикселей.

Если ты переставишь блоки (сначала диск), лучи пройдут поверх него до центра: что нарисовано позже, лежит сверху. Одно число: 120 на 200, и лучи выйдут далеко за диск.

7. Радужная спираль

import turtle

t = turtle.Turtle()
t.speed(0)
t.width(2)
turtle.bgcolor("black")

colors = ["red", "orange", "yellow", "green", "blue", "purple"]

for i in range(100):
    t.pencolor(colors[i % 6])   # i % 6 — это всегда 0, 1, 2, 3, 4 или 5
    t.forward(i * 2)
    t.left(59)

turtle.done()

Что получится: на чёрном фоне шестиугольная спираль из 100 линий, цвета идут по кругу от красного до фиолетового, размер около 370 × 390. i % 6 — остаток от деления на 6, поэтому индекс не вылезет за пределы списка, сколько бы раз ты ни повторял цикл.

Измени одно число: с 60 закрутка исчезнет, получатся вложенные шестиугольники с прямыми цветными секторами. С 61 спираль закрутится в другую сторону.

8. Флаг Украины

import turtle

t = turtle.Turtle()
t.speed(0)
t.hideturtle()

def rect(x, y, w, h, color):   # (x, y) — левый нижний угол
    t.penup()
    t.goto(x, y)
    t.pendown()
    t.color(color, color)
    t.begin_fill()
    for _ in range(2):
        t.forward(w)
        t.left(90)
        t.forward(h)
        t.left(90)
    t.end_fill()

W = 300
H = 200    # пропорции 3 : 2

rect(-160, -250, 10, 450, "saddlebrown")   # древко
rect(-150, 0, W, H / 2, "#0057B7")         # синяя полоса
rect(-150, -H / 2, W, H / 2, "#FFD700")     # жёлтая полоса

turtle.done()

Что получится: флаг 300 × 200 (пропорция 3 : 2, как у государственного), синяя полоса сверху, жёлтая снизу, слева древко. #0057B7 и #FFD700 — распространённые коды этих цветов для экрана. Из rect() ты соберёшь и флаг Франции или Италии: три вертикальные полосы по W / 3.

Измени одно число: H = 120. Полосы станут ниже и останутся вплотную, потому что жёлтая стоит на -H / 2. Если написать там -100, между полосами появляется белая щель: мы проверили.

9. Цветок из дуг

import turtle

t = turtle.Turtle()
t.speed(0)
t.color("hotpink", "pink")

for _ in range(8):         # 8 лепестков
    t.begin_fill()
    t.circle(100, 90)       # четверть круга
    t.left(90)
    t.circle(100, 90)       # ещё четверть — обратно в центр
    t.end_fill()
    t.left(45)             # 360 / 8 = 45

# серединка
t.penup()
t.goto(0, -20)
t.pendown()
t.color("orange", "yellow")
t.begin_fill()
t.circle(20)
t.end_fill()

turtle.done()

Что получится: розовый цветок из 8 лепестков и жёлтая серединка. Лепесток — две четверти круга радиусом 100: дугой от центра, разворот на 90°, дугой обратно. Весь цветок около 280 × 280.

Измени одно число: 45 на 90, и ты увидишь, как все восемь лепестков лягут в одно место. Лепесток сам поворачивает черепашку на 270°, ещё 90 дают полный оборот, так что каждый следующий начинается там же, где предыдущий.

10. Ночной город

import turtle
import random

t = turtle.Turtle()
t.hideturtle()
turtle.bgcolor("midnightblue")
turtle.tracer(0)           # рисовать всё сразу, без анимации

def go(x, y):
    t.penup()
    t.goto(x, y)
    t.pendown()

def rect(x, y, w, h, color):
    go(x, y)
    t.color(color, color)
    t.begin_fill()
    for _ in range(2):
        t.forward(w)
        t.left(90)
        t.forward(h)
        t.left(90)
    t.end_fill()

# 1. Звёзды в случайных местах верхней половины
for _ in range(80):
    go(random.randint(-300, 300), random.randint(0, 280))
    t.dot(random.randint(2, 5), "white")

# 2. Месяц-серп: жёлтый круг, а поверх — круг цвета неба
go(200, 120)
t.color("khaki", "khaki")
t.begin_fill()
t.circle(40)
t.end_fill()
go(218, 130)
t.color("midnightblue", "midnightblue")
t.begin_fill()
t.circle(40)
t.end_fill()

# 3. Пять домов разной высоты с окнами
for i in range(5):
    x = -300 + i * 120
    h = random.randint(100, 220)
    rect(x, -280, 100, h, "dimgray")
    for row in range(h // 40):          # этажи
        for col in range(3):            # три окна на этаже
            light = random.choice(["gold", "black"])
            rect(x + 12 + col * 28, -265 + row * 40, 18, 22, light)

turtle.update()            # после tracer(0) показать готовый рисунок
turtle.done()

Что получится: тёмно-синее небо, 80 звёзд, месяц-серп вверху справа и пять серых домов высотой от 100 до 220 пикселей. Окна по три на этаж случайно светятся жёлтым или тёмные. Поэтому каждый раз ты получаешь другой город. Так и задумано.

Мы собрали здесь всё предыдущее: функции, цикл в цикле, заливка, слои (серп — жёлтый круг, частично закрытый кругом цвета неба). Новое только turtle.tracer(0): черепашка не показывает каждый шаг, и сотни линий появляются почти сразу. Но после этого экран сам не обновляется, поэтому перед done() стоит turtle.update(), без него часть рисунка может не появиться.

Измени одно число: range(300) вместо 80 даст густое небо.

Сломанный пример: почему фигура не замыкается

Самая частая ошибка в черепашке — угол. Вот шестиугольник, в котором мы нарочно ошиблись:

import turtle

t = turtle.Turtle()
t.width(3)

for _ in range(6):
    t.forward(100)
    t.left(50)       # ошибка: для шестиугольника нужно 360 / 6 = 60

print(t.position())
turtle.done()

В консоли:

(-67.86,96.91)

Шесть сторон пройдено. А поворот только 6 × 50 = 300°. Не хватает 60°, так что на экране незамкнутый многоугольник, похожий на букву С, и конец линии висит в 118 пикселях от старта.

print(t.position()) годится как проверка любой твоей фигуры: замкнутая даст (0.00,0.00), иногда с минусом перед нулём — это погрешность дробных чисел. А угол лучше не подбирать, а считать:

import turtle

t = turtle.Turtle()
t.width(3)

def polygon(n, side):
    for _ in range(n):
        t.forward(side)
        t.left(360 / n)

polygon(6, 100)
print(t.position())
turtle.done()

polygon(3, 100) даёт треугольник, polygon(36, 20) почти круг. Другие ошибки новичков (отступы, скобки, двоеточия) собраны в статье о типичных ошибках в Python.

Что нарисовать самому

Когда все десять у тебя заработают, собери что-то своё из тех же команд:

  • снежинку: шесть веток через 60°, на каждой по две веточки (цикл в цикле);
  • радугу из полукругов t.circle(r, 180), каждый следующий меньше на 10;
  • улицу из домиков, где высота берётся из random.randint.

На ступени Python Старт (6–10 лет) у нас с таких рисунков начинается текстовый код: ошибка в строке сразу видна на картинке. Потом из той же черепашки делают первые игры, а дальше переходят на Pygame — вот как выглядит первая игра.