Коротко: черепашка (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 — вот как выглядит первая игра.