Python turtle: черепашья графика с нуля до фракталов

Модуль turtle входит в стандартную библиотеку Python — и это, пожалуй, самый короткий путь от «я вообще не программист» до работающей графики. Никаких установок, никаких фреймворков: пара строк импорта, и на экране появляется окно с черепашкой, которая послушно выполняет команды. Именно поэтому черепашья графика десятилетиями живёт в школьных курсах — но не только там. Она отлично справляется с визуализацией рекурсии, фракталов, кривых и любых алгоритмов, где результат проще увидеть, чем описать словами.
Идея черепашьей графики пришла из языка Logo, созданного Сеймуром Папертом в конце 1960-х для обучения детей математике. Управляемая «черепашка» с ручкой на спине позволяла ребёнку буквально телом почувствовать геометрию: повернул на 90 градусов — нарисовал угол. В Python эта концепция переехала в модуль turtle и стала частью стандартной поставки. Технически turtle — это надстройка над Tkinter. Каждая черепашка — объект на Canvas, а каждая команда движения превращается в рисование линии или изменение состояния пера. Отсюда и главное ограничение: производительность упирается в скорость Tkinter, а не в ваш код. Отсюда же и приятный бонус: модуль не требует pip install, работает на Windows, macOS, Linux и даже в браузерных средах вроде Trinket.
Где turtle реально полезен:
- обучение программированию и геометрии;
- визуализация рекурсивных алгоритмов — фракталы, обход дерева;
- демонстрация математических кривых и преобразований;
- быстрые скетчи для генеративного искусства;
- прототипы интерфейсов с простой графикой.
Если нужно понять, правильно ли работает рекурсивная функция, — нарисуйте её через turtle. Ошибка в базовом случае станет видна на экране за секунды.
Есть два подхода к API. Первый — процедурный, когда вы вызываете функции модуля напрямую: turtle.forward(100). Второй — объектный, когда создаёте экземпляр Turtle(). Второй удобнее, если черепашек несколько или вы пишете функции, принимающие черепашку как аргумент. Минимальный каркас выглядит так: создаётся окно через turtle.Screen(), настраиваются заголовок, цвет фона и размеры, затем появляется сама черепашка с заданной формой курсора, цветом пера и толщиной линии. Квадрат рисуется четырьмя шагами вперёд с поворотом налево на 90 градусов.
Обратите внимание на mainloop(). Это самая частая ошибка новичков: скрипт отрабатывает, окно мигает и исчезает. Метод mainloop() или turtle.done() держит окно открытым и обрабатывает события. Стандартный модуль ставить не нужно, но есть отдельный пакет PythonTurtle с более дружелюбной оболочкой для детей, а также colabturtle для Jupyter и Colab.
Почти весь модуль держится на десятке методов. forward(d) двигает вперёд на d пикселей, рисуя линию, backward(d) — назад, right(a) и left(a) поворачивают на a градусов, goto(x, y) перемещает в абсолютную точку, setheading(a) задаёт абсолютный угол, penup() и pendown() поднимают или опускают перо, circle(r, angle) рисует дугу или окружность, dot(size) ставит точку, begin_fill() и end_fill() заливают замкнутый контур цветом fillcolor, speed(n) управляет скоростью анимации от 0 до 10, write(text) выводит текст в текущей позиции, clone() создаёт копию черепашки. Система координат стандартная: центр экрана — (0, 0), ось Y направлена вверх, а не вниз, как в большинстве графических библиотек. Углы отсчитываются против часовой стрелки от направления вправо.
Простая фигура быстро наскучит, поэтому переходим к функции, которая рисует правильный N-угольник. Это классический переход от повторения к параметризации: угол вычисляется как 360 / sides, и цикл повторяется нужное число раз. Дальше — рекурсия. Снежинка Коха строится рекурсивным делением каждого отрезка на три части с выступом. Это, пожалуй, самый наглядный способ показать, как работает рекурсивный вызов: базовый случай просто рисует отрезок, а иначе длина делится на три, и функция вызывает себя четыре раза с поворотами на 60 и 120 градусов. Глубина 4 — это уже 3 × 4⁴ = 768 отрезков на сторону. Глубина 6 даст 12 288 отрезков, и без оптимизации вы будете ждать результата неприлично долго.
Рекурсия в turtle упирается в лимит интерпретатора — по умолчанию 1000 вызовов. Для глубоких фракталов поднимайте его осознанно: import sys; sys.setrecursionlimit(5000). И помните: это может уронить процесс, если перестараться.
Три инструмента превращают учебные примеры в рабочие. speed(0) убирает задержку между шагами, но каждый шаг всё равно прорисовывается. Кардинально ускоряет только tracer(0): он запрещает перерисовку экрана до вызова update(). Разница ощутима на порядок: если с speed(0) «цветок» из 360 лучей рисуется десятки секунд, то с tracer(0) — доли секунды. Цвет задаётся именем, HEX-строкой или кортежем RGB в диапазоне 0–255 при включённом режиме turtle.colormode(255). Заливка работает корректно только для замкнутого контура — если фигура не замкнута, turtle достроит её по прямой до начальной точки. Текст выводится методом write с указанием выравнивания и шрифта.
Модуль умеет обрабатывать ввод, и это открывает путь к простым интерактивным программам. Привязка клавиш делается через screen.onkey(функция, 'клавиша'), клик мышью — через screen.onclick с лямбдой, принимающей координаты. Забыли screen.listen()? Клавиши молчат. Это вторая по частоте ошибка после отсутствующего mainloop().
Прежде чем тащить turtle в проект, полезно понимать, где он уместен, а где нет. Порог входа у него очень низкий, он входит в стандартную библиотеку, но скорость отрисовки низкая, анимация в реальном времени слабая, игровой логики нет, научные графики — только базовые. Для игр и высокой частоты кадров turtle не подходит — берите pygame или arcade. Для визуализации данных — matplotlib. Но для объяснения алгоритма, обучения или быстрого арт-скетча turtle выигрывает по времени «от идеи до картинки».
Несколько практических советов из опыта. Не плодите черепашек без нужды: каждая — отдельный объект на Canvas, десятки штук заметно замедлят отрисовку. Используйте tracer(0) плюс update() для всего, что рисуется дольше пары секунд. Прячьте курсор через t.hideturtle(), когда он мешает финальной картинке. Сохраняйте результат скриншотом: встроенного экспорта в PNG у модуля нет, хотя можно вытащить вектор через screen.getcanvas().postscript() и конвертировать в SVG или PNG отдельно — но это редко оправдано. Для Jupyter смотрите в сторону colabturtle или ipyturtle: обычный turtle в ноутбуках часто не отображается. И разделяйте логику и рисование: функция, которая вычисляет точки, не должна знать про turtle — так код тестируется без графики.
Автор этих строк долго считал turtle игрушкой для шестиклассников, пока не столкнулся с задачей объяснить коллеге-аналитику, как работает рекурсивный обход дерева решений. Схема на доске не заходила. Скетч на turtle, который рисовал ветви под углом и подсвечивал листья, объяснил всё за минуту. С тех пор модуль держится в голове как инструмент коммуникации, а не только обучения. Да, он медленный и не умеет экспортировать PNG, но порог входа настолько низкий, что для демонстрации идеи это часто важнее производительности.
Нужно ли устанавливать turtle? Нет, модуль входит в стандартную поставку CPython. Единственная оговорка: на Linux-сборках без Tk нужно доустановить пакет python3-tk. Почему окно закрывается мгновенно? Программа завершилась и процесс вышел — добавьте screen.mainloop() или turtle.done() в конец скрипта. Как ускорить рисование в разы? Комбинация speed(0) плюс tracer(0) и один финальный update(). Можно ли использовать turtle в веб-приложении? Напрямую — нет, он привязан к Tkinter. Для браузера есть javascript-реализации вроде p5.js, а Pyodide поддерживает turtle с серьёзными ограничениями по событиям. Сколько черепашек разумно держать одновременно? На практике — единицы. При десятках объектов интерфейс начинает заметно тормозить, даже с отключённой анимацией.
turtle — это модуль, который стоит держать в арсенале независимо от уровня. Он не заменит pygame в игре и matplotlib в отчёте, но даёт то, чего нет у них: минимальную дистанцию от строки кода до видимого результата. Освойте forward, left, penup, begin_fill и tracer — и вы сможете визуализировать почти любой алгоритм за пять минут. Начните с квадрата, закончите снежинкой Коха. Проверено: работает и затягивает.


