Графика черепашки (turtle) в Python: от простого к сложному
Основы работы с модулем turtle
Модуль turtle в Python предоставляет простую графическую среду, имитирующую движение черепашки по холсту. Основные команды: forward() (движение вперед), right() / left() (поворот), penup() / pendown() (поднять/опустить перо), color() (задать цвет), begin_fill() / end_fill() (заливка). Для отображения окна необходимо вызвать turtle.done() или screen.mainloop().
Пример простейшего рисунка - квадрат:
import turtle
t = turtle.Turtle()
for _ in range(4):
t.forward(100)
t.right(90)
turtle.done()Python черепашка (графика turtle в python)
Код создает окно с черепашкой, которая рисует квадрат со стороной 100 шагов. Команда turtle.done() удерживает окно открытым.
Типичная ошибка: окно закрывается сразу. Решение - добавить turtle.done() или turtle.mainloop() в конце программы.
Еще одна проблема: черепашка не рисует. Причина - перо поднято (penup()). Следует вызвать pendown().
Как нарисовать квадрат, треугольник и круг с помощью черепашки?
Для треугольника достаточно трех повторений с поворотом на 120 градусов. Круг рисуется командой circle(радиус).
import turtle
t = turtle.Turtle()
# квадрат
for _ in range(4):
t.forward(100)
t.right(90)
# треугольник
for _ in range(3):
t.forward(100)
t.right(120)
# круг
t.circle(50)
turtle.done()
Ошибка: фигура не закрывается - неверный угол поворота. Для замкнутого многоугольника сумма внешних углов должна быть 360 градусов. Для n-угольника угол равен 360/n.
Как изменить цвет линии и заливки фигуры?
Цвет задается через color(): первый аргумент - цвет линии, второй (опционально) - цвет заливки. Либо раздельно: pencolor() и fillcolor().
import turtle
t = turtle.Turtle()
t.color('red', 'yellow') # красная линия, желтая заливка
t.begin_fill()
for _ in range(4):
t.forward(100)
t.right(90)
t.end_fill()
turtle.done()
Проблема: заливка не появляется. Необходимо вызвать begin_fill() перед рисованием и end_fill() после. Также контур фигуры должен быть замкнут.
Как нарисовать закрашенную фигуру (например, звезду)?
Звезда рисуется несколькими линиями, заливка применяется после завершения контура. Важно, чтобы фигура была замкнутой (начальная и конечная точки совпадают).
import turtle
t = turtle.Turtle()
t.color('blue', 'orange')
t.begin_fill()
for _ in range(5):
t.forward(150)
t.right(144)
t.end_fill()
turtle.done()
Ошибка: звезда не замыкается. Убедитесь, что сумма углов 720 градусов (5 поворотов по 144 дают 720).
Как использовать циклы для создания повторяющихся узоров?
Циклы позволяют повторять блоки с изменением параметров. Например, квадратная спираль: сторона увеличивается с каждым витком.
import turtle
t = turtle.Turtle()
t.speed(10)
for i in range(100):
t.forward(i)
t.right(90)
turtle.done()
Проблема: бесконечный цикл - задайте конечное число итераций. Увеличьте скорость speed(0) для быстрого рисования.
Как нарисовать снежинку Коха или другой фрактал?
Фракталы реализуются с помощью рекурсии. Каждый отрезок делится на три части, средняя заменяется равносторонним треугольником.
import turtle
t = turtle.Turtle()
t.speed(0)
def koch(length, depth):
if depth == 0:
t.forward(length)
else:
koch(length/3, depth-1)
t.left(60)
koch(length/3, depth-1)
t.right(120)
koch(length/3, depth-1)
t.left(60)
koch(length/3, depth-1)
t.penup()
t.goto(-200, 100)
t.pendown()
for _ in range(3):
koch(400, 3)
t.right(120)
turtle.done()
Ошибка: превышение глубины рекурсии - уменьшите параметр depth (3-4 достаточно).
Как обрабатывать события клавиатуры и мыши в turtle?
Модуль поддерживает прослушивание нажатий клавиш и кликов. Регистрация обработчика через screen.onkey() и screen.onclick(). Для фокуса клавиатуры вызывается screen.listen().
import turtle
t = turtle.Turtle()
screen = turtle.Screen()
def move_forward():
t.forward(10)
def turn_left():
t.left(15)
def turn_right():
t.right(15)
def clear_drawing():
t.clear()
def draw_circle(x, y):
t.penup()
t.goto(x, y)
t.pendown()
t.circle(30)
screen.onkey(move_forward, 'Up')
screen.onkey(turn_left, 'Left')
screen.onkey(turn_right, 'Right')
screen.onkey(clear_drawing, 'c')
screen.onclick(draw_circle)
screen.listen()
screen.mainloop()
Проблема: события не срабатывают. Убедитесь, что вызван screen.listen() и окно активно. Для Windows могут конфликтовать некоторые клавиши.
Как работать с несколькими черепашками одновременно?
Создается несколько экземпляров Turtle. Каждый имеет собственное состояние. Движение выполняется поочередно или в циклах.
import turtle
t1 = turtle.Turtle()
t2 = turtle.Turtle()
t1.color('red')
t2.color('blue')
t1.penup()
t1.goto(-50, 0)
t1.pendown()
t2.penup()
t2.goto(50, 0)
t2.pendown()
for i in range(4):
t1.forward(100)
t2.forward(100)
t1.right(90)
t2.left(90)
turtle.done()
Проблема: черепашки рисуют поверх друг друга - используйте разные начальные позиции.
Как настроить окно, фон и заголовок?
Через объект Screen устанавливаются размеры, цвет фона и заголовок.
import turtle
screen = turtle.Screen()
screen.setup(800, 600) # ширина, высота
screen.bgcolor('lightgreen') # цвет фона
screen.title('Моя графика') # заголовок окна
t = turtle.Turtle()
t.forward(100)
turtle.done()
Ошибка: окно не соответствует заданным размерам - setup() работает до создания черепашки.
Расширенные примеры использования turtle
1. Цветная спираль с изменением цвета
Программа рисует спираль, постепенно меняя длину шага и цвет пера.
import turtle
t = turtle.Turtle()
screen = turtle.Screen()
screen.bgcolor('black')
t.speed(0)
colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple']
for i in range(360):
t.pencolor(colors[i % 6])
t.forward(i * 0.5)
t.right(59)
turtle.done()
На черном фоне появляется разноцветная спираль, закручивающаяся по часовой стрелке. Цвета сменяют друг друга.
2. Фрактальное дерево
Рекурсивно рисуется ветвящееся дерево. Глубина рекурсии 7.
import turtle
t = turtle.Turtle()
t.speed(0)
t.left(90)
t.penup()
t.backward(200)
t.pendown()
def tree(length, depth):
if depth == 0:
return
t.forward(length)
t.left(45)
tree(length * 0.7, depth - 1)
t.right(90)
tree(length * 0.7, depth - 1)
t.left(45)
t.backward(length)
tree(150, 7)
turtle.done()
Графическое окно показывает дерево с семью уровнями ветвления, ветви становятся тоньше и короче.
3. Мандала с поворотами
Рисуется круговой узор из 36 повторяющихся элементов.
import turtle
import math
t = turtle.Turtle()
t.speed(0)
for i in range(36):
t.circle(50)
t.right(10)
turtle.done()
В центре окна возникает узор из 36 пересекающихся окружностей, напоминающий цветок или мандалу.
4. Простая игра с управлением стрелками
Черепашкой можно управлять с клавиатуры, оставляя след. Нажатие 'c' очищает экран, клик мыши ставит точку.
import turtle
t = turtle.Turtle()
screen = turtle.Screen()
screen.title('Управление черепашкой')
screen.bgcolor('lightyellow')
t.shape('turtle')
t.speed(5)
def forward():
t.forward(10)
def backward():
t.backward(10)
def left():
t.left(15)
def right():
t.right(15)
def clear():
t.clear()
t.penup()
t.home()
t.pendown()
def stamp(x, y):
t.penup()
t.goto(x, y)
t.stamp()
screen.onkey(forward, 'Up')
screen.onkey(backward, 'Down')
screen.onkey(left, 'Left')
screen.onkey(right, 'Right')
screen.onkey(clear, 'c')
screen.onclick(stamp)
screen.listen()
screen.mainloop()
Открывается окно с черепашкой. Стрелками можно перемещать ее, 'c' очищает и возвращает в центр, клик мыши оставляет отпечаток черепашки в указанной точке.