Графика черепашки (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' очищает и возвращает в центр, клик мыши оставляет отпечаток черепашки в указанной точке.

Графика turtle в Python - comments

En
Python черепашка (python)