Что такое turtle в Python
Модуль turtle — это часть стандартной библиотеки Python, которая рисует картинки движением виртуальной черепашки. Устанавливать ничего не нужно: достаточно написать import turtle в первой строке программы. Поэтому turtle в Python часто становится первой библиотекой, с которой знакомится школьник.
Представьте робота на листе бумаги. У него есть голова, которая смотрит в одну сторону, и карандаш, прижатый к листу. Скажете «пройди 100 шагов» — он проедет вперёд и оставит линию. Скажете «повернись налево на 90 градусов» — он развернётся на месте. Именно так работает черепашка: каждая команда меняет либо её положение, либо направление, либо перо. Ребёнок сразу видит результат своей программы, а ошибка выглядит не как строчка красного текста, а как кривой домик, который хочется исправить.
Попробуйте программу в редакторе выше. Нажмите «▶ Запустить» или Ctrl+Enter, и черепашка нарисует на белом холсте под редактором зелёный квадрат и оранжевый круг. Меняйте числа и запускайте снова. Кнопка «Сбросить» вернёт исходный код, а черновик сохраняется в браузере, так что после перезагрузки страницы работа не пропадёт.
Откуда взялась черепашка: от Logo к Python
Черепашья графика пришла из языка Logo, который придумали для детей; главную книгу о нём — «Mindstorms» — математик Сеймур Пейперт выпустил в 1980 году[1]. Модуль в Python повторяет ту же идею почти без изменений.
Пейперт считал, что ребёнку легче понять геометрию, если он может «стать» черепашкой: пройтись по комнате, повернуться и почувствовать, что такое угол в 90 градусов. Затем то же движение записывается командами, и компьютер его повторяет. В этом подходе ученик не решает задачи из учебника, а учит черепашку рисовать то, что ему самому интересно. Позже эту мысль развили создатели Scratch в MIT Media Lab: блок «Перо» в Scratch — дальний родственник той же черепашки.
Модуль turtle в Python появился как способ знакомить новичков с программированием через картинку. Официальная документация Python прямо называет черепашью графику популярным способом обучения детей. Названия команд взяты из английского: forward — вперёд, left — налево, right — направо, penup — поднять перо.
Первая программа: forward, left и right
Чтобы черепашка нарисовала линию, хватит 3 строк: импорт модуля, создание черепашки и команда forward. Дальше добавляются повороты черепашки — и получается фигура.
import turtle
t = turtle.Turtle()
t.forward(150)
t.left(90)
t.forward(80)
Разберём по строкам. turtle.Turtle() создаёт черепашку и кладёт её в переменную t; так мы сможем позже завести вторую черепашку с другим цветом. В начале она стоит в центре холста, в точке с координатами (0, 0), и смотрит вправо. Команда forward(150) двигает её на 150 точек экрана вперёд, left(90) поворачивает на 90 градусов против часовой стрелки. Поворот направо — right, шаг назад — backward.
У каждой команды есть короткое имя: fd, bk, lt, rt. Работают они одинаково, но новичку лучше писать полные слова: код читается как текст, и его проще проверить глазами.
Главные команды черепашки в одной таблице
Для первых рисунков хватит 12 команд: движение, повороты, перо, цвет и скорость. Остальные можно найти в документации, когда появится конкретная задача.
| Команда | Что делает | Пример |
forward(n) | идёт вперёд на n точек | t.forward(100) |
backward(n) | идёт назад, не поворачиваясь | t.backward(50) |
left(a), right(a) | поворот на a градусов | t.left(90) |
penup(), pendown() | поднять и опустить перо | t.penup() |
pensize(n) | толщина линии | t.pensize(4) |
color(c) | цвет пера и заливки | t.color("red") |
speed(s) | скорость от 1 до 10, 0 — без анимации | t.speed(0) |
circle(r) | круг радиуса r | t.circle(50) |
goto(x, y) | переход в точку | t.goto(0, 100) |
begin_fill(), end_fill() | залить фигуру | см. ниже |
hideturtle() | спрятать черепашку | t.hideturtle() |
Перо: penup, pendown и толщина линии
Перо — это то, что оставляет след: пока оно опущено, каждое движение рисует линию, а после penup() черепашка ходит невидимо. Поворачивается и двигается черепашка при этом как обычно. Так переходят к новому месту рисунка, не соединяя фигуры лишней чертой.
import turtle
t = turtle.Turtle()
for i in range(5):
t.pendown()
t.forward(20)
t.penup()
t.forward(15)
Эта программа рисует пунктир из 5 штрихов. Внутри цикла перо то опускается, то поднимается. Без penup() перейти в другую точку без следа не получится. Толщину линии задаёт pensize: 1 — тонкая, 5 — заметная, 10 — как маркер. Если толщина не меняется, проверьте, что вы вызываете команду у своей черепашки, то есть пишете t.pensize(5), а не просто pensize(5) без импорта такой функции.
Цвет, заливка и скорость
Цвет задают английским названием в кавычках — "red", "blue", "gold" — или кодом вида "#ff8800". Чтобы закрасить фигуру внутри, её рисуют между командами begin_fill и end_fill.
import turtle
t = turtle.Turtle()
t.color("purple", "pink")
t.begin_fill()
for i in range(3):
t.forward(120)
t.left(120)
t.end_fill()
Команда color с двумя значениями задаёт сразу цвет контура и цвет заливки: здесь контур фиолетовый, а треугольник внутри розовый. Если указать одно значение, оно станет и тем, и другим. Русские названия цветов модуль не понимает: в обычном Python строка «красный» вызовет ошибку, поэтому писать их не стоит. Полный список допустимых имён и форматов приведён в официальной документации Python. Цвет фона холста меняют через экран: turtle.Screen().bgcolor("lightblue").
Скорость важна для больших рисунков. По умолчанию черепашка движется плавно, чтобы было видно каждый шаг. Значения от 1 до 10 ускоряют анимацию, а 0 убирает её совсем — картинка появляется почти сразу. Для отладки ставьте медленную скорость: так легче заметить, на каком повороте всё пошло не так.
Круги, дуги и многоугольники через circle
Команда circle(r) рисует круг радиуса r, центр которого лежит на r точек левее черепашки. Если радиус отрицательный, круг пойдёт по часовой стрелке, то есть в другую сторону.
У команды есть ещё два необязательных параметра. Второй — угол дуги: t.circle(60, 180) рисует полукруг. Третий — число сторон: t.circle(60, 360, 6) рисует шестиугольник, вписанный в круг. Это удобный способ получить правильный многоугольник без расчёта углов, хотя в задачах полезнее посчитать угол самому: 360 делим на число сторон. Подробно о квадратах, звёздах и спиралях рассказано в статье о рисовании фигур черепашкой.
import turtle
t = turtle.Turtle()
t.speed(0)
for i in range(12):
t.circle(50)
t.left(30)
Двенадцать кругов с поворотом на 30 градусов складываются в цветок: 12 × 30 = 360, поэтому узор замыкается ровно. Измените 12 и 30 так, чтобы произведение тоже было 360, и посмотрите, как меняется рисунок.
Координаты холста и команда goto
Холст turtle в Python — это координатная плоскость: точка (0, 0) в центре, x растёт вправо, y — вверх. Команда goto(x, y) переносит черепашку прямо в нужную точку, не меняя направления её взгляда.
Если перо опущено, goto оставит прямую линию от старой точки до новой. Поэтому перед переходом обычно пишут penup(), а после — pendown(). Узнать, где сейчас черепашка, помогают t.xcor() и t.ycor(), а направление задаёт t.setheading(угол): 0 — вправо, 90 — вверх, 180 — влево, 270 — вниз. Холст в редакторе на странице небольшой, поэтому держите рисунок в пределах примерно 200 точек от центра по горизонтали и 150 по вертикали — иначе часть картинки уйдёт за край.
Такая же система координат с центром в нуле есть на сцене Scratch, только там размер сцены 480 на 360. Ребёнку, который двигал спрайты блоком «перейти в x: y:», команда goto покажется знакомой.
Turtle в Python и школьная информатика
Черепашка — это один из исполнителей, которых по федеральной образовательной программе изучают в 8 классе вместе с Роботом и Чертёжником[2]. Модуль на Python помогает перейти от школьного исполнителя к настоящему языку.
На уроке исполнитель Черепашка часто живёт в среде КуМир и понимает команды «вперёд», «назад», «направо», «налево», «поднять хвост» и «опустить хвост». Смысл тот же, что у forward, right и penup. Если ученик рисовал фигуры черепашкой в школе, он легко переведёт свои программы в Python, а заодно потренирует циклы и переменные. Про исполнителей подробно рассказано на странице о Роботе, Черепашке и Чертёжнике.
Модуль удобен и как мост от блоков к тексту. Ученик, который строил узоры пером в Scratch, видит в черепашьей программе те же действия, но набранные словами. При этом он сразу встречается с синтаксисом Python: двоеточием, отступом в 4 пробела, скобками у функций.
Когда рисование кодом не подходит
Рисование кодом не подходит для задач, где нужна скорость, ввод с клавиатуры в реальном времени или работа с файлами. Вот 4 случая, когда лучше выбрать другой инструмент.
- Игра с 60 кадрами в секунду. Модуль рисует медленно; для динамичных игр берут отдельные игровые библиотеки, а начинающим проще собрать игру в Scratch.
- Рисунок из 100 000 точек. Даже со скоростью 0 такая картинка строится долго, а в браузерном редакторе может упереться в ограничение времени работы.
- Подготовка к заданию 16 ОГЭ. Там нужна программа, которая читает числа и выводит ответ, а рисование это не тренирует.
- Ребёнок 6–7 лет, который ещё не печатает. Набирать команды ему трудно, лучше начать с блоков и игр без компьютера.
Миф: «черепашья графика — детская игрушка, к настоящему программированию отношения не имеет». Это не подтверждается: в таких программах используются те же циклы, функции, переменные и условия, что и в любом коде на Python, просто результат виден картинкой.
Миф: «для turtle нужно скачивать отдельную библиотеку». Отдельного пакета не существует: модуль входит в стандартную поставку Python и запускается из IDLE сразу после установки языка.
Чего делать нельзя
Нельзя называть свой файл turtle.py — это самая частая причина загадочных ошибок у новичков. Руководство PEP 8 советует давать модулям короткие имена из строчных букв, но совпадать с именем стандартного модуля при этом не следует. Остальные правила тоже экономят время.
- Нельзя называть файл turtle.py: Python импортирует ваш файл вместо модуля, и команды «пропадут».
- Не стоит писать команды без скобок:
t.penupбез()ничего не делает, и перо остаётся опущенным. - Не следует запускать огромные узоры на медленной скорости — сначала проверьте форму на маленьком числе повторов.
- Не стоит смешивать градусы и шаги:
left(100)— это поворот на 100 градусов, а не движение. - Нельзя забывать penup перед goto, если линия между фигурами не нужна.
- Не стоит копировать одну команду 36 раз вместо цикла: такой код невозможно быстро изменить.
Если хочется больше идей, загляните в подборку заданий для черепашки с рисунками по возрастанию сложности. А чтобы не путаться в сообщениях интерпретатора, держите под рукой разбор как читать ошибки Python.
Источники
[1] Papert S. Mindstorms: Children, Computers, and Powerful Ideas. New York: Basic Books, 1980.
[2] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования».
[3] The Python Tutorial (официальная документация Python 3). Python Software Foundation.
[4] Maloney J., Resnick M., Rusk N., Silverman B., Eastmond E. The Scratch Programming Language and Environment // ACM Transactions on Computing Education. 2010. Vol. 10, № 4. Article 16.
Вопросы и ответы
Работает ли turtle в Python на телефоне?
Редактор на этой странице работает в браузере, в том числе на планшете, но печатать код удобнее с клавиатуры. Для домашней установки нужен компьютер с Python и средой IDLE.
Почему окно с рисунком сразу закрывается?
При запуске файла на компьютере программа заканчивается и окно исчезает. Добавьте в конец строку turtle.done() — окно останется открытым, пока вы его не закроете.
Можно ли завести несколько исполнителей сразу?
Да. Каждый вызов turtle.Turtle() создаёт новую, со своим цветом и положением. Их удобно хранить в разных переменных, например a и b.
Как поменять стрелку на фигурку черепахи?
Команда t.shape("turtle") меняет стрелку на фигурку черепахи. Есть и другие формы: "circle", "square", "triangle", "arrow".
С какого возраста можно рисовать кодом?
Когда ребёнок уверенно читает и набирает слова латиницей, обычно в 9–11 лет. Помощь взрослого с первыми командами ускоряет старт, но рисовать он должен сам.
Почему круг получился не там, где я ждал?
Центр круга лежит не в текущей точке, а на расстоянии радиуса слева. Перейдите вниз на радиус перед рисованием, и центр окажется в нужной точке.