Глава 7 · Глубокое погружение в Turtle
Отладка графики
Более продвинутая графика добавляет новые, специфичные способы ошибиться — разберём их по схеме «симптом → причина → исправление».
Графика добавляет несколько новых, специфичных для более продвинутого Turtle способов что-то сделать не так — разберём их по схеме «симптом → причина → исправление».
| Симптом | Причина | Исправление |
|---|---|---|
| Окружность рисуется не в ту сторону, чем ожидалось | Радиус имеет не тот знак — положительный вместо отрицательного или наоборот | Проверьте знак: положительный радиус — против часовой стрелки, отрицательный — по |
| Текст появился совсем не там, где ожидалось | Забыли переместить черепашку через goto()/penup() перед write() — текст выводится от ТЕКУЩЕЙ позиции | Переместитесь в нужную точку до вызова write() |
| Заливка не закрасилась, хотя fillcolor() был задан | Контур между begin_fill() и end_fill() не замкнулся — черепашка не вернулась в стартовую точку | Проверьте, что путь образует ЗАМКНУТУЮ фигуру — конец совпадает с началом |
| RGB-цвет вызывает ошибку вроде «недопустимое значение цвета» | Числа не соответствуют текущему colormode — например, (255, 0, 0) при colormode(1.0) | Сверьте числа с активным режимом — 0–255 или 0.0–1.0 |
| Код выполняется без ошибок, но на экране совсем ничего не появилось | Вызван screen.tracer(0), но забыт screen.update() — экран так и не обновился ни разу | Добавьте screen.update() после всех команд рисования |
| На экране остался штамп, хотя казалось, что он должен был исчезнуть | clearstamp() вызван с неверным id, либо id вообще не был сохранён при вызове stamp() | Сохраняйте id каждого stamp() в переменную/список сразу при создании |
| Две черепашки двигаются одинаково, хотя должны были разойтись | Обе переменные на самом деле ссылаются на ОДНУ и ту же черепашку (например, bob = alice вместо bob = turtle.Turtle()) | Создавайте каждую черепашку отдельным вызовом turtle.Turtle() или через clone() |
| Курсор черепашки выглядит повёрнутым не в ту сторону, хотя движется верно | Спутаны heading (направление движения) и tilt (визуальный поворот курсора) — они независимы | heading меняют left()/right()/setheading(); внешний вид — только tilt()/tiltangle() |
| Часть рисунка не видна, хотя код точно её рисует | Координаты вышли за пределы окна — оно не бесконечное | Проверьте screen.setup()/screensize() и держите координаты в пределах видимой области |
tracer(0) без update() — разберём подробно
Это настолько частая и настолько незаметная ошибка, что заслуживает отдельного разбора. Программа выполняется полностью, без единой ошибки — но экран остаётся девственно пустым:
tracer_bug.py
screen.tracer(0)
for _ in range(4):
artist.forward(100)
artist.right(90)
# если здесь нет screen.update() — окно так и останется пустым!
Мысленная модель
tracer(0) — это не «выключить рисование», а «не показывать его на экране, пока не попросят». Рисование продолжает происходить по-настоящему, просто оно невидимо, пока не вызван update().Практика: отладка графики (без Turtle)
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки