Простое рисование с помощью черепашки¶
У неё есть функции в стиле turtle.forward(. ) и turtle.left(. ) , с помощью которых черепашка может двигаться.
Перед тем как начать работу с черепашкой, необходимо импортировать соответствующий модуль. Мы рекомендуем экспериментировать с ней в интерактивной оболочке (для начала), т.к. при использовании файлов придётся заниматься дополнительной утомительной работой. Перейди в терминал и введи:
import turtle

Not seeing anything on Mac OS? Try issuing a command like turtle.forward(0) and looking if a new window opened behind your command line.
Используешь Ubuntu и получаешь сообщение об ошибке “No module named _tkinter”? Установи отсутствующий необходимый пакет: sudo apt-get install python3-tk
While it might be tempting to just copy and paste what’s written on this page into your terminal, we encourage you to type out each command. Typing gets the syntax under your fingers (building that muscle memory!) and can even help avoid strange syntax errors.
turtle.forward(25)

turtle.left(30)

Функция turtle.forward(. ) заставляет черепашку двигаться вперёд на указанное расстояние. turtle.left(. ) приказывает черепашке повернуться влево на указанную градусную меру угла. А turtle.backward(. ) и turtle.right(. ) действуют анлогично — первая заставляет черепашку двигаться назад, а вторая — поворачиваться вправо.
Если ты хочешь начать заново, введи turtle.reset() , чтобы стереть рисунок. Мы рассмотрим turtle.reset() подробнее немного позже.
Стандартная “черепашка” – всего лишь треугольник. Это не интересно! Придадим ей нормальный вид командой turtle.shape() :
turtle.shape("turtle")
Так намного лучше!
If you put the commands into a file, you might have recognized that the turtle window vanishes after the turtle finished its movement. (That is because Python exits when your turtle has finished moving. Since the turtle window belongs to Python, it terminates as well.) To prevent that, just put turtle.exitonclick() at the bottom of your file. Now the window stays open until you click on it:
import turtle turtle.shape("turtle") turtle.forward(25) turtle.exitonclick()
Python — язык программирования, в котором крайне важны отступы в коде. Подробности мы узнаем позже, в главах про функции, но сейчас тебе просто необходимо запомнить, что лишний пробел или символ табуляции перед строкой может вызвать ошибку.
Рисуем квадрат¶
You’re not always expected to know the anwer immediately. Learn by trial and error! Experiment, see what python does when you tell it different things, what gives beautiful (although sometimes unexpected) results and what gives errors. If you want to keep playing with something you learned that creates interesting results, that’s OK too. Don’t hesitate to try and fail and learn from it!
Упражнение¶
Нарисуй квадрат, как на рисунке ниже:

Для квадрата тебе понадобится прямоугольный, т.е. 90-градусный, угол.
Решение¶
turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90)
Notice how the turtle starts and finishes in the same place and facing the same direction, before and after drawing the square. This is a useful convention to follow, it makes it easier to draw multiple shapes later on.
Дополнительно¶
If you want to get creative, you can modify your shape with the turtle.width(. ) and turtle.color(. ) functions. How do you use these functions? Before you can use a function you need to know its signature (for example the number of parameters and what they mean.) To find this out you can type help(turtle.color) into the Python shell. If there is a lot of text, Python will put the help text into a pager, which lets you page up and down. Press the q key to exit the pager.
Видишь такую ошибку:
NameError: name 'turtle' is not defined
когда пытаешься просмотреть справку? В Python необходимо импортировать имена, перед тем, как обращаться к ним, т.е. в нашем случае необходимо выполнить import turtle перед help(turtle.color) .
Также найти информацию о функциях можно в онлайн-документации.
Если ты допустил ошибку, то ты можешь воспользоваться командой turtle.reset() , чтобы стереть рисунок, либо командой turtle.undo() ., чтобы отменить последние действия.
As you might have read in the help, you can modify the color with turtle.color( colorstring ) . These include but are not limited to “red,” “green,” and “violet.” See the colours manual for an extensive list.
Рисуем прямоугольник¶
Упражнение¶
Ты тоже можешь нарисовать прямоугольник?

Решение¶
turtle.forward(100) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(100) turtle.left(90) turtle.forward(50) turtle.left(90)
Дополнительно¶
How about a triangle? In an equilateral triangle (a triangle with all sides of equal length) each corner has an angle of 60 degrees.
Больше квадратов¶
Упражнение¶
Now, draw a tilted square. And another one, and another one. You can experiment with the angles between the individual squares.

На изображении показан поворот черепашки на 20 градусов. Ты же можешь попробовать, например, 30 или 40.
Решение¶
turtle.left(20) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.left(30) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.left(40) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90) turtle.forward(50) turtle.left(90)
© Авторские права 2012–2014, OpenTechSchool and contributors.
Создано с помощью Sphinx 1.3.1.
Примеры графика в python
В этом уроке мы разберём пример работы графического модуля turtle в Python. Подробно разберём, как рисовать окружности в turtle в Питон и закрашенные области.
Пример графической программы на Python, в которой задаётся процедура отображения цветка. В основной программе эта процедура вызывается и на поле отображаются пять цветков разного цвета.
Чтобы импортировать модуль turtle в программу на Питон, используется команда
from turtle import *
Создадим черепашку t с помощью команды
t = Turtle()
Зададим поле размером 800×800 пикселей
t.screen.setup(800, 800)
Создадим процедуру в питон рисование цветка. Начнём задание процедуры flower с аргументами x, y и color с помощью команды def. x, y это положение центра цветка, color это цвет лепестков.
def flower(x, y, color):
Перейдём в процедуру с помощью знака : двоеточия. Все команды, принадлежащие процедуры, должны иметь отступы слева от них. Подробнее в уроке Синтаксис языка Python. Условия в Python.
По умолчанию, черепашка при движении будет отображать свою траекторию. Чтобы избежать этого, используется команда t.up().
t.up()
Создадим цветок с длиной стебля 200 пикселей. Переместим черепашку на 200 пикселей вниз от положения центра цветка.
t.goto(x, y — 200)
Направим черепашку вверх, чтобы стебель был повёрнут вверх.
t.setheading(90)
Перекрасим черепашку в зелёный цвет. Траектория черепашки будет отображаться таким же цветом, что и сама черепашка.
t.color(«green»)
Сделаем так, чтобы черепашка отображала свою траекторию.
t.down()
Переместим черепашку вперёд, чтобы она нарисовала стебель. Черепашка зелёная, поэтому и нарисованный стебель будет зелёного цвета.
t.fd(200)
Повернём черепашку вправо, чтобы нарисовать центр цветка жёлтым цветом.
t.setheading(0)
Меняем цвет черепашки на жёлтый.
t.color(«yellow»)
Центр цветка должен быть залит. Заливка фигур выполняется с помощью команды
t.begin_fill()
Для того, чтобы фигура залилась, нужно после её отображения закончить заливку командой
t.end_fill()
Нарисуем целую окружность радиусом 20 пикселей командой t.circle(20, 360) и зальём её жёлтым цветом.
t.begin_fill()
t.circle(20, 360)
t.end_fill()
Нам нужно нарисовать 4 лепестка цветка. Сделаем это с помощью цикла for в программе питон. Лепестки будут отображаться снизу, сверху и с боков жёлтого круга. Сначала нарисуем нижний лепесток, затем по краю жёлтого круга перейдём на 90 градусов вперёд, чтобы переместиться на бок жёлтого круга. Повторим эти действия четыре раза, после чего черепашка вернётся в низ жёлтого круга.
Сначала нужно сменить цвет на выбранный цвет color с помощью команды t.color(color). Затем нужно нарисовать и залить лепесток. Начнём заливку командой t.begin_fill(), рисуем лепесток радиусом 35 пикселей t.circle(-35, 360) и заканчиваем заливку t.end_fill(). Минус перед радиусом лепестка нужен, чтобы черепашка при отображении окружности двигалась не влево, а вправо, если бы этого знака не было, то лепестки загораживали бы центр цветка. Для отображения следующего лепестка нужно переместить черепашку на 90 вперёд относительно жёлтой окружности. Сменим цвет черепашки на жёлтый t.color(«yellow»), чтобы на центре цветка не оставалось лишних деталей, и переместим черепашку на 90 градусов вперёд с помощью команды t.circle(20, 90). Радиус центра цветка был равен 20 пикселям, черепашка движется по окружности на 90 градусов далее.
for i in range(4):
t.color(color)
t.begin_fill()
t.circle(-35, 360)
t.end_fill()
t.color(«yellow»)
t.circle(20, 90)
Мы объявили процедуру отображения цветка. Чтобы черепашка рисовала всё быстро, используем команду
t.speed(0)
Теперь вызовем процедуру flower(x, y, color) пять раз с различными координатами и цветами.
flower(-250, 250, «red»)
flower(200, -200, «blue»)
flower(100, 100, «green»)
flower(-100, 100, «cyan»)
flower(-200, -200, «purple»)
В конце любой программы нужно добавить две команды, чтобы Ваша программа не останавливалась и не выдавала ошибку.
t.screen.exitonclick()
t.screen.mainloop()
Полный код примера.
from turtle import *
t = Turtle()
t.screen.setup(800, 800)
def flower(x, y, color):
t.up()
t.goto(x, y — 200)
t.setheading(90)
t.color(«green»)
t.down()
t.fd(200)
t.setheading(0)
t.color(«yellow»)
t.begin_fill()
t.circle(20, 360)
t.end_fill()
for i in range(4):
t.color(color)
t.begin_fill()
t.circle(-35, 360)
t.end_fill()
t.color(«yellow»)
t.circle(20, 90)
t.speed(0)
flower(-250, 250, «red»)
flower(200, -200, «blue»)
flower(100, 100, «green»)
flower(-100, 100, «cyan»)
flower(-200, -200, «purple»)
t.screen.exitonclick()
t.screen.mainloop()
Теперь напишем программу, которая рисует пять цветков на случайных местах в окне для графики разными цветами.
Импортируем все нужные модули. Для задания координат случайным образом мы используем модуль random.
from turtle import *
import random as r
Подготавливаем окно для графики и черепашку.
t = Turtle()
t.screen.setup(800, 800)
Для отображения цветков нам нужно будет задать случайные координаты. Создадим две глобальные переменные a для оси абсцисс и b для оси ординат.
a = 0
b = 0
Создадим массив color со всеми цветами, которые мы будем использовать при отображении цветков.
col = [«red», «blue», «green», «cyan», «purple»]
Зададим случайные значения a и b с помощью процедуры coord(). В ней мы будем использовать глобальные переменные a и b, для этого используется команда global a, где a это название переменной. Случайные значения этих переменных будут задаваться командой r.randint(-200, 200). Значения -200 и 200 выбраны затем, чтобы отображаемые цветки не выходили за пределы окна для графики.
def coord():
global a
global b
a = r.randint(-200, 200)
b = r.randint(-200, 200)
Пример. Программа Python рисует пять цветков на различных местах на поле. Место отображения цветка задаётся случайным образом
Процедура отображения цветка flower точно такая же, как и в прошлом примере.
Мы вызовем пять процедур отображения цветка flower с помощью цикла for. В теле цикла сначала мы зададим случайные числа a и b с помощью процедуры coord(). После этого мы используем числа a и b как координаты цветка, а цвет лепестков мы будем брать из массива.
for i in range(5):
coord()
flower(a, b, col[i])
Полный код примера.
from turtle import *
import random as r
t = Turtle()
t.screen.setup(800, 800)
a = 0
b = 0
col = [«red», «blue», «green», «cyan», «purple»]
def coord():
global a
global b
a = r.randint(-200, 200)
b = r.randint(-200, 200)
def flower(x, y, color):
t.up()
t.goto(x, y — 200)
t.setheading(90)
t.color(«green»)
t.down()
t.fd(200)
t.setheading(0)
t.color(«yellow»)
t.begin_fill()
t.fillcolor(«yellow»)
t.circle(20, 360)
t.end_fill()
for i in range(4):
t.color(color)
t.begin_fill()
t.circle(-35, 360)
t.end_fill()
t.color(«yellow»)
t.circle(20, 90)
t.speed(0)
for i in range(5):
coord()
flower(a, b, col[i])
t.screen.exitonclick()
t.screen.mainloop()
Результат работы программы

Полезно почитать по теме графика в python
Модуль графика turtle в python
«Черепашка на Питоне онлайн»
t.begin_fill(), t.end_fill() Начать и остановить заливку. Например, нарисовать жёлтый круг с красным контуром:
t.color('red') t.fillcolor('yellow') t.begin_fill() t.circle(100) t.end_fill()
Или, например, нарисовать жёлтый пятиугольник с красным контуром:
t.color('red') t.fillcolor('yellow') t.begin_fill() t.circle(100, 360, 5) t.end_fill()
Основные команды
t.backward(d) Передвинуться назад на d пикселей, например, на 50:
t.backward(50)
t.circle(r) Нарисовать круг радиусом r, например, 50 пикселей:
t.circle(50)
t.circle(r, angle, n) Нарисовать дугу радиусом r, c углом angle и числом шагов n. Чем больше число шагов, тем плавнее дуга. Например, нарисуем дугу радиусом 50 пикселей, с углом 180 градусов и числом шагов 100:
t.circle(50, 180, 100)
t.circle(r, 360, n) Нарисовать многоугольник с радиусом описанной окружности r и числом сторон n. Например, нарисуем шестиугольник с радиусом описанной окружности 100 пикселей:
t.circle(100, 360, 6)
t.color(c) Изменить цвет на c. Рекомендуемые цвета: -black, -blue, -brown, -cyan, -gold, -green, -grey, -magenta, -orange, -pink, -red, -violet, -yellow. Цвет ставится в кавычки. Например, изменим цвет на красный:
t.color('red')
t.forward(d) Передвинуться вперёд на d пикселей, например, на 50:
t.forward(50)
t.goto(x,y) Перейти в точку с координатами (x,y), например, (100,15):
t.goto(100, 150)
t.left(angle) Повернуть налево на угол angle, например, на 90 градусов:
t.left(90)
t.penup() Поднять перо. Если перо поднято, черепашка не оставляет след при движении:
t.penup()
t.pendown() Опустить перо. Если перо опущено, черепашка оставляет след при движении:
t.pendown()
t.right(angle) Повернуть направо на угол angle, например, на 60 градусов:
t.right(60)
t.stamp() Поставить отпечаток, эта команда без параметров:
t.stamp()
Документация для тех, кто знает английский язык
Некоторые типы ошибок
SyntaxError — синтаксическая ошибка, например, в строке 5:
SyntaxError: bad input on line 5
IndentationError — ошибка в отступе, например, в строке 10:
IndentationError: unindent does not match any outer indentation level on line 10
NameError — ошибка в имени переменной, например, переменная ‘p’ не определена в строке 11:
NameError: name 'p' is not defined on line 11
AttributeError — ошибка в атрибуте, например, в строке 7, так как у черепашки нет метода print():
AttributeError: 'Turtle' object has no attribute 'print' on line 7
TypeError — ошибка в числе или типах аргументов, например, при вызове left() не задан угол поворота, правильно t.left(90), t.left(45), t.left(-20).
TypeError: left() takes exactly 1 positional argument(s) (0 given) on line 17
«Черепашья графика» при помощи turtle, рисование при помощи алгоритма
Черепашья графика, turtle – принцип организации библиотеки графического вывода, построенный на метафоре Черепахи, воображаемого роботоподобного устройства, которое перемещается по экрану или бумаге и поворачивается в заданных направлениях, при этом оставляя (или, по выбору, не оставляя) за собой нарисованный след заданного цвета и ширины.
Проще: черепашка ползает по экрану и рисует. Мы управляем черепашкой на плоскости при помощи программы.
Начало работы. Движения
В первой строке необходимо добавить:
import turtle
Мы командуем черепашкой простыми словами на английском языке. left, right – поворот налево и направо, forward и backward – движение вперед и назад. В программе каждое действие – вызов функции из модуля turtle. Простая программа:
import turtle turtle.right(90) turtle.forward(100) turtle.left(90) turtle.backward(100)
Что произошло:
- Поворот направо на 90 градусов
- Движение вперед на 100 шагов (пикселей)
- Поворот налево на 90 градусов
- Движение назад на 100 шагов
Не похоже на черепашку, это ползающая стрелка! Исправим это:
import turtle turtle.shape("turtle") turtle.fd(100) turtle.exitonclick()
Отлично! Теперь это черепашка, пусть и монохромная. Дополнительно, функция exitonclick() позволяет закрыть окно и завершить выполнение программы кликом мышкой по окну.
А еще можно использовать сокращенные названия функций: fd(100) вместо forward(100), rt вместо right, lt вместо left, bk вместо backward.
Геометрические фигуры
Рисуем простые геометрические фигуры:
- Прямая: просто движение вперед
- Квадрат: вперед, поворот на 90 градусов и так 4 раза. Повторение команд – значит, можно выполнить их в цикле for!
- Пятиконечная звезда: вперед, поворот на 144 градусов и так 5 раз.
Если мы хотим выполнить инструкции n раз, мы пишем их в цикле
for i in range(n):
Далее идут инструкции с отступом в 4 пробела. Код с отступами – тело цикла. Когда цикл завершается, отступы больше не ставятся.
Рисуем квадрат:
import turtle square = turtle.Turtle() square.shape("turtle") for i in range(4): square.forward(100) square.right(90) turtle.exitonclick()
Скучно рисовать одинокие фигуры. Поэтому мы приготовились рисовать сразу несколько и теперь создаем отдельный экземпляр класса Turtle для каждой фигуры. Так мы можем менять цвет линии и другие параметры отдельно для каждой фигуры. Потом, когда мы захотим дорисовать или изменить параметры фигуры, у нее будут сохранены старые параметры. Их не надо будет устанавливать заново, как это было бы без отдельных экземпляров класса для каждой фигуры.
Звезда рисуется также:
Самостоятельно:
- Нарисуйте пятиконечную звезду (угол поворота 144 градуса).
- Квадрат и звезду в одной программе, на одном графическом поле, но с разными экземплярами класса Turtle.
- Восьмиконечную звезду (угол поворота 135 градусов).
- Фигуру из анимации в начале страницы.
Решения
Квадрат и звезда
import turtle square = turtle.Turtle() for i in range(4): square.forward(100) square.right(90) starf = turtle.Turtle() for i in range(5): starf.forward(100) starf.right(144) turtle.exitonclick()
8-конечная звезда
import turtle star = turtle.Turtle() star.hideturtle() for i in range(8): star.forward(100) star.right(135) turtle.exitonclick()
9-конечная звезда
import turtle nineang = turtle.Turtle() for i in range(9): nineang.forward(100) nineang.left(140) nineang.forward(100) nineang.right(100) turtle.exitonclick()
Изменяем параметры во время движения
При отрисовке простых фигур черепашка возвращалась в исходную точку, и программа останавливалась, ожидая, когда будет закрыто окно. Если в цикле продолжить рисовать по прежним инструкциям, фигура будет нарисована заново по уже нарисованным контурам. А если ввести дополнительный угол поворота?
import turtle square = turtle.Turtle() square.shape("turtle") square.color('red', 'green') square.begin_fill() for j in range(3): square.left(20) for i in range(4): square.forward(100) square.left(90) square.end_fill() turtle.exitonclick()

Мы также добавили:
- color(‘red’, ‘green’) определяет цвет линии и цвет заполнения. Черепашка теперь зеленая!
- begin_fill() и end_fill() обозначают начало и конец заполнения
Больше программирования!
Напишем обобщенную программу рисования выпуклых равносторонних многоугольников. num_sides – количество граней, side_length – длина грани, angle – угол поворота.
import turtle polygon = turtle.Turtle() num_sides = 6 side_length = 100 angle = 360.0 / num_sides for i in range(num_sides): polygon.forward(side_length) polygon.right(angle) turtle.exitonclick()
Что будет, если на каждом шаге увеличивать длину пути? В первый день 10 шагов, во второй – 20, далее 30, 40 и так до 200:
import turtle spiral = turtle.Turtle() for i in range(20): spiral.forward(i * 10) spiral.right(144) turtle.exitonclick()
Координаты на плоскости
Положение на плоскости определяется двумя числами, x и y:

Черепашку в программе можно перемещать функцией goto(x, y). x и y – числа, или переменные. goto(0, 0) переместит черепашку в начало координат.
import turtle spiral = turtle.Turtle() for i in range(20): spiral.fd(i * 10) spiral.rt(144) spiral.goto(0,0) turtle.exitonclick()
Вместо звезды-спирали мы получили 5 линий, расходящихся из точки начала координат.
Круг и точка
Не хватает плавных изгибов? На помощь приходят функции dot() и circle():
import turtle turtle.title("Turtle Drawing") circle = turtle.Turtle() circle.shape("turtle") circle.pensize(5) circle.pencolor("cyan") circle.dot(20) circle.penup() circle.goto(0, -100) circle.pendown() circle.circle(100) turtle.exitonclick()

- изменили заголовок окна функцией title(),
- установили толщину линии – pensize(),
- установили цвет линии – pencolor(),
- Подняли черепашку перед перемещением – penup() и опустили после – pendown().
Самостоятельно:
- Используя код из примеров и функцию goto(), нарисовать галерею из 5 или более многоугольников на одном поле. Использовать экземпляр класса turtle.Turtle().
- Нарисованные многоугольники закрасить разными цветами. Пробуйте стандартные цвета или их шестнадцатеричное представление. Не забудьте кавычки вокруг названия или кода цвета!
Решения
- У нас есть два варианта нарисовать несколько фигур: используя отдельные классы и не используя их. Рассмотрим оба варианта.
- Без классов:
import turtle turtle.hideturtle() turtle.speed(10) turtle.color('red') turtle.begin_fill() for i in range(4): turtle.forward(100) turtle.right(90) turtle.end_fill() turtle.penup() turtle.goto(200, 200) turtle.pendown() turtle.color('green') turtle.begin_fill() for i in range(5): turtle.forward(100) turtle.rt(144) turtle.end_fill() turtle.penup() turtle.goto(-200, -200) turtle.pendown() turtle.color('blue') turtle.begin_fill() for i in range(8): turtle.forward(100) turtle.right(135) turtle.end_fill() turtle.penup() turtle.goto(200, -200) turtle.pendown() turtle.color('cyan') turtle.begin_fill() for i in range(3): turtle.forward(100) turtle.lt(120) turtle.end_fill() turtle.penup() turtle.goto(-200, 200) turtle.pendown() turtle.color('magenta') turtle.begin_fill() for i in range(9): turtle.forward(30) turtle.right(140) turtle.forward(30) turtle.left(100) turtle.end_fill() turtle.exitonclick()
import turtle square = turtle.Turtle() square.hideturtle() square.color('red') square.speed(10) square.begin_fill() for i in range(4): square.forward(100) square.right(90) square.end_fill() square.penup()
import turtle def prepare(x, y, color): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color(color) turtle.begin_fill() def draw_polygon(num_sides, side_length): angle = 360.0 / num_sides for i in range(num_sides): turtle.forward(side_length) turtle.right(angle) turtle.hideturtle() turtle.speed(10) prepare(0, 0, 'red') draw_polygon(3, 100) turtle.end_fill() prepare(200, 200, 'green') draw_polygon(4, 100) turtle.end_fill() prepare(-200, -200, 'blue') draw_polygon(5, 100) turtle.end_fill() prepare(200, -200, 'cyan') draw_polygon(6, 100) turtle.end_fill() prepare(-200, 200, 'magenta') draw_polygon(7, 100) turtle.end_fill() turtle.exitonclick()
import turtle def prepare(x, y, color): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color(color) turtle.begin_fill() def draw_polygon(num_sides, side_length): angle = 360.0 / num_sides for i in range(num_sides): turtle.forward(side_length) turtle.right(angle) turtle.end_fill() turtle.hideturtle() turtle.speed(10) colors = ['red', 'green', 'blue', 'cyan', 'magenta'] xcoords = [0, 200, -200, 200, -200] ycoords = [0, 200, -200, -200, 200] for i in range(5): prepare(xcoords[i], ycoords[i], colors[i]) draw_polygon(i+3, 100) turtle.exitonclick()
Делаем фигуры равновеликими
Площадь квадрата со стороной 100 пикселей – 10 000 квадратных пикселей. Вычислим площади всех фигур со стороной 100 от треугольника до 7-угольника. Формула площади правильного многоугольника содержит тангенс, поэтому «поверим на слово» результату, зависимости количество углов (вершин) – площадь:
- 3 – 4330.13
- 4 – 10000
- 5 – 17204.77
- 6 – 25980.76
- 7 – 36339.12
Изобразим ее на графике:

Получается, что площадь 7-угольника в 36339.12 / 4330.13 = 8.4 раза больше, чем площадь треугольника! Это очень заметно на рисунке:

Чтобы фигуры стали равновеликими, надо сделать длину грани вместо константы 100 – переменной, которая зависит от количества углов.
Как: приведем все площади к 10000. Для треугольника площадь увеличится на 10000 / 4330.13 = 2.31 раза. Для 7-угольника – уменьшится в 36339.12 / 10000 = 3.63 раз. Значит, стороны должны измениться в 1.52 и 0.52 раз соответственно, то есть, до 152 и 32.7 пикселей (снова «верим на слово»). Эту зависимость можно нащупать «на глаз», в чем и заключалось задание.
Наша программа без труда масштабируется до большего количества фигур:

Программа, в которой вычисляются точные значения:
import turtle from math import tan, sqrt, pi def prepare(x, y, color): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color(color) turtle.begin_fill() def draw_polygon(num_sides, side_length): angle = 360.0 / num_sides for i in range(num_sides): turtle.forward(side_length) turtle.right(angle) turtle.end_fill() def calc_s(num_sides, side_length): return num_sides * side_length ** 2 / (4 * tan(pi/num_sides)) def calc_side(square): return sqrt(4 * square * tan(pi/num_sides) / num_sides) turtle.hideturtle() turtle.speed(10) colors = ['red', 'green', 'blue', 'cyan', 'magenta', 'black', 'yellow', 'pink', 'brown'] xcoords = [0, 150, -150, 150, -150, 270, -270, 270, -270] ycoords = [0, 150, -150, -150, 150, 270, -270, -270, 270] squares = [] numsides = [] for i in range(9): num_sides = i + 3 square = round(calc_s(num_sides, 100), 2) side_length = round(calc_side(10000), 3) squares.append(square) numsides.append(num_sides) print("Углов:", num_sides, "была площадь:", square, "стала длина грани:", side_length, "изменение в", round(side_length/100, 2), "раз") prepare(xcoords[i], ycoords[i], colors[i]) draw_polygon(num_sides, side_length) turtle.exitonclick() print("Список количество углов:", numsides, end="") print("Список площади:", squares)
Углов: 3 была площадь: 4330.13 стала длина грани: 151.967 изменение в 1.52 раз Углов: 4 была площадь: 10000.0 стала длина грани: 100.0 изменение в 1.0 раз Углов: 5 была площадь: 17204.77 стала длина грани: 76.239 изменение в 0.76 раз Углов: 6 была площадь: 25980.76 стала длина грани: 62.04 изменение в 0.62 раз Углов: 7 была площадь: 36339.12 стала длина грани: 52.458 изменение в 0.52 раз Углов: 8 была площадь: 48284.27 стала длина грани: 45.509 изменение в 0.46 раз Углов: 9 была площадь: 61818.24 стала длина грани: 40.22 изменение в 0.4 раз Углов: 10 была площадь: 76942.09 стала длина грани: 36.051 изменение в 0.36 раз Углов: 11 была площадь: 93656.4 стала длина грани: 32.676 изменение в 0.33 раз Список количество углов: [3, 4, 5, 6, 7, 8, 9, 10, 11] Список площади: [4330.13, 10000.0, 17204.77, 25980.76, 36339.12, 48284.27, 61818.24, 76942.09, 93656.4]
Как построить график (если кто захочет):
pip install matplotlib
import matplotlib.pyplot as plt numsides = [3, 4, 5, 6, 7, 8, 9, 10, 11] squares = [4330.13, 10000.0, 17204.77, 25980.76, 36339.12, 48284.27, 61818.24, 76942.09, 93656.4] plt.plot(numsides, squares, 'or--') plt.xlabel('Количество углов') plt.ylabel('Площадь') plt.show()
Другие полезные функции:
- turtle.setup(800, 400) устанавливает размеры окна в 800 на 400 пикселей
- turtle.setworldcoordinates(0, 0, 800, 400) устанавливает начало координат в точку 800, 400
- turtle.tracer(0, 0) отключает анимацию
- setpos(x, y) устанавливает черепашку (курсор) в позицию с координатами (x, y)
- seth(x) устанавливает направление в градусах. 0 – горизонтально направо (на восток), 90 – вверх (на север) и так далее
- hideturtle() скрывает черепашку (или стрелку, курсор)
- speed(x) изменяет скорость рисования. Например, speed(11) – почти моментальная отрисовка простых фигур
- clear() очищает холст от нарисованного
- reset() очищает холст и возвращает курсор в начало координат
Пример двух рисунков – экземпляров класса Turtle() – на одном полотне
import turtle turtle.title("Turtle Circles") circ = turtle.Turtle() circ.pencolor("purple") circ.fillcolor("orange") circ.shape("circle") circ.pensize(5) circ.speed(10) circ.fd(150) circ.begin_fill() circ.circle(90) circ.end_fill() n = 10 t = turtle.Turtle() while n

Что произошло:
- Задали название окна,
- создали экземпляр класса Turtle под именем circ. Все изменения сохраняются для класса circ;
- цвет линии и заполняющий цвет,
- форму и размер курсора,
- установили 10-ю скорость
- продвинулись на 150 пикселей вперед от старта,
- начали заполнять фигуру цветом,
- нарисовали круг
- закончили заполнять цветом,
- Объявили переменную n и присвоили ей значение 10,
- создали новый экземпляр класса Turtle под именем t. У него нет настроек экземпляра класса circ!
- В цикле while: пока переменная n меньше или равна 50, рисовать круги радиусом n;
- после нарисованного круга увеличить переменную n на 10.
- Алгоритм рисования кругов прекратит рисовать круги после 4-го круга.
Итог: функции и классы на примере turtle
- Функция – фрагмент программного кода, к которому можно обратиться по имени. Иногда функции бывают безымянными.
- У функции есть входные и выходные параметры. Функция fd(150) – фрагмент программного кода, который двигает курсор вперед на заданное во входном значении количество пикселей (150). Выходного значения у функции fd() нет.
- Когда функцию надо выполнить, после ее названия пишут круглые скобки. fd – просто название, ничего не происходит. fd(100) – функция выполняется с входным параметром 100. Обычно названия функций пишут с маленькой буквы.
- Класс – программный шаблон для создания объектов, заготовка для чего-то, имеющего собственное состояние. Мы можем нарисовать прямоугольник и назвать его кнопкой, но это еще не кнопка, потому что у нее нет собственных свойств и поведения. Прямоугольник надо научить быть самостоятельной, отличной от других, кнопкой.
- Turtle – класс, его имя пишется с большой буквы. через оператор присваивания = мы создаем экземпляр класса: circ = turtle.Turtle(). Turtle – класс (шаблон, трафарет, заготовка), circ – его экземпляр (рисунок, набор уникальных цветов, штрихов и свойств). На картинке выше видно, что экземпляр класса circ богат установленными свойствами, а экземпляр t обладает свойствами по умолчанию: тонкая черная линия, треугольный курсор.
- Программирование с использованием классов и их экземпляров будем называть объектно-ориентированным программированием, ООП. объектно-ориентированный подход необходим при построении графического интерфейса пользователя, GUI.
Графический интерфейс средствами библиотеки turtle.
Нарисуем прямоугольник и сделаем его кнопкой: при нажатии кнопка исчезает и появляется круг:
import turtle wndow = turtle.Screen() wndow.title("Screen & Button") wndow.setup(500, 500) btn1 = turtle.Turtle() btn1.hideturtle() for i in range(2): btn1.fd(80) btn1.left(90) btn1.fd(30) btn1.left(90) btn1.penup() btn1.goto(11,7) btn1.write("Push me", font=("Arial", 12, "normal")) def btnclick(x, y): if 0
Что произошло:
- Задали название и размеры (500 на 500 пикселей) окна,
- Создали экземпляр класса btn1 и спрятали курсор (черепашку),
- Нарисовали прямоугольник 80 на 30;
- подняли перо и перешли на координаты (11, 7);
- написали Push me шрифтом Arial 12-го размера, нормальное начертание. Попробуйте вместо normal ключевые слова bold (полужирный), italic (наклонный);
Задаем поведение кнопки:
- Функции turtle.listen() и turtle.onscreenclick() будут слушать (listen) и реагировать на клик по экрану (onscreenclick). Реакцией будет запуск функции btnclick(x, y)
- Напишем btnclick(x, y). У нее 2 входных параметра – координаты точки, куда мы кликнули. Наша задача: если клик был по кнопке, спрятать ее и показать оранжевый круг
- Мы помним: кнопка 80 на 30 пикселей от точки (0, 0). Значит, мы попали по кнопке, если x между 0 и 80 и y между 0 и 30. Условие попадания по кнопке: if 0
- 1) Убираем кнопку: btn1.clear(), 2) создаем экземпляр класса ball = turtle.Turtle(), 3) устанавливаем ему нужные свойства.
Самостоятельно:
- Нарисовать вторую кнопку (не изменяя первую!), сделать обработчик нажатия: при клике программа завершается, выполняется функция exit()
- При нажатии на первую кнопку появляется случайная фигура: при рисовании фигуры использовать random:
from random import randrange print(randrange(30, 201)) # случайное целое число от 30 до 200
Уточнения
- Чтобы окно не закрывалось сразу, мы использовали turtle.exitonclick(). Теперь, когда клик обрабатывается функцией, пишем в конце turtle.done().
- функция exit() самостоятельная, это не команда turtle. Писать turtle.exit() неверно.
- Случайная фигура – это любая фигура, при рисовании которой используются случайные числа. Например:
from random import randrange circle = turtle.Turtle() circle.circle(randrange(36, 91))
Но есть и второй вариант: случайное число будет индексом списка и укажет на одну из заранее подготовленных неслучайных фигур:
from random import randrange figures = ['circle', 'rectangle', 'triangle'] choice = figures[randrange(0, 3)] # случайный индекс от 0 до 2 даст одно из трех слов списка
Таким приемом можно случайно выбирать цвета фигур. Функция choice делает тоже самое изящнее:
from random import randrange, choice colors = ['red', 'green', 'blue'] color = colors[randrange(0, 3)] another_color = choice(colors)
Управляем рисунком с клавиатуры
Итак, мы умеем рисовать фигуры разных форм и стилей, перемещать курсор в разные точки холста, а также обрабатывать клик мышкой по фигуре. Добавим к этим действиям обработку нажатий клавиш. Для этого существуют две функции:
- turtle.onkeypress(fun, key): вызывается функция fun при нажатии клавиши key
- turtle.onkey(fun, key): вызывается функция fun при отпускании клавиши key
Клавиша задается строкой с ее названием. Например, 'space' – пробел, 'Up' (с заглавной буквы) – стрелка вверх. Клавиши букв задаются заглавными, только если мы хотим нажать именно заглавную (с Shift или Caps Lock).
По нажатию клавиши мы будем перемещать фигуру. Для этого понадобятся функции, которые сообщают и изменяют координаты:
- xcor() и ycor() выдают координаты по x и y как дробные числа
- setx(x) и sety(y) устанавливают координаты. x и y – числа
Создадим экземпляр класса Turtle и выведем его координаты:
import turtle circ = turtle.Turtle() circ.shape("circle") circ.color("orange") circ.penup() print(circ.xcor(), circ.ycor())
Получили вывод "0.0 0.0". Теперь напишем функцию up(), которая будет запускаться при нажатии стрелки вверх и перемещать наш circ на 10 пикселей вверх:
import turtle circ = turtle.Turtle() circ.shape("circle") circ.color("orange") circ.penup() def up(): y = circ.ycor() + 10 circ.sety(y) turtle.listen() turtle.onkeypress(up, 'Up') turtle.done()
Очень похоже на нажатие мышкой! Функцию up() можно сократить до одной строчки:
def up(): circ.sety(circ.ycor() + 10)
Будет работать, но функции в одну строчку писать не принято. Для таких случаев используют анонимные функции: у них может вовсе не быть имени. В Python в качестве анонимных функций используются лямбда-выражения, мы их уже использовали для сортировки. Так будет выглядеть лямбда-функция up:
up = lambda: circ.sety(circ.ycor() + 10)
Она используется у нас только в одном месте, внутри функкии turtle.onkeypress(). А почему бы не соединить их вместе? Так будет выглядеть наша программа в сокращенном виде:
import turtle circ = turtle.Turtle() circ.shape("circle") circ.color("orange") circ.penup() turtle.listen() turtle.onkeypress(lambda: circ.sety(circ.ycor() + 10), 'Up') turtle.done()
Всего 8 строк, и функции действительно не понадобилось имени! Как видим, язык Python дает возможность писать разными стилями, и мы можем выбирать на свой вкус: писать развернуто и красиво (как писал Гавриил Романович Державин) или кратко (как Эрнест Хемингуэй).
Самостоятельно:
- Добавить движение circ влево, вправо и вниз
- Скорость движения (у нас пока 10 пикселей за раз) сделать переменной
Соединяем все вместе
У нас уже есть кнопка с текстом и обработчик клика мышкой. Соединим все в одну программу:
import turtle wndow = turtle.Screen() wndow.title("Circle game") wndow.setup(500, 500) btn1 = turtle.Turtle() btn1.hideturtle() for i in range(2): btn1.fd(80) btn1.left(90) btn1.fd(30) btn1.left(90) btn1.penup() btn1.goto(4, 5) btn1.write("Start!", font=("Arial", 12, "normal")) circ = turtle.Turtle() circ.hideturtle() circ.shape("circle") circ.color("orange") def btnclick(x, y): if 0
Есть стартовый экран, управляемый с клавиатуры персонаж. Добавим препятствие, и уже почти готова игра!
import turtle wndow = turtle.Screen() wndow.title("Circle game") wndow.setup(500, 500) btn1 = turtle.Turtle() btn1.hideturtle() for i in range(2): btn1.fd(80) btn1.left(90) btn1.fd(30) btn1.left(90) btn1.penup() btn1.goto(4, 5) btn1.write("Start!", font=("Arial", 12, "normal")) circ = turtle.Turtle() circ.hideturtle() circ.shape("circle") circ.color("orange") sq = turtle.Turtle() sq.hideturtle() sq.penup() sq.setposition(-20, 70) def btnclick(x, y): if 0
Самостоятельно:
- Нарисовать фигуры, которые надо обойти герою игры. Это может быть простой лабиринт!
- Написать условное выражение (если координаты circ больше заданных величин), при котором наступает победа, и игра заканчивается. Это может быть выход из лабиринта!
- В программе должно быть реализовано движение во все 4 стороны. Можно использовать стрелки, можно – клавиши WASD. Также можно реализовать движение по диагонали, когда за один ход изменяются обе координаты.
Подсказки
- Движение во все 4 стороны:
import turtle circ = turtle.Turtle() circ.shape("circle") circ.color("orange") circ.penup() turtle.listen() turtle.onkeypress(lambda: circ.setx(circ.xcor() + 10), 'Right') turtle.onkeypress(lambda: circ.setx(circ.xcor() - 10), 'Left') turtle.onkeypress(lambda: circ.sety(circ.ycor() + 10), 'Up') turtle.onkeypress(lambda: circ.sety(circ.ycor() - 10), 'Down') turtle.done()
turtle.onkeypress(up, 'Up') # движение вверх по кнопке вверх turtle.onkeypress(up, 'w') # движение вверх по кнопке w turtle.onkeypress(up, 'W') # движение вверх по W (w с нажатой Shift или CapsLock)
def upright(): x = circ.xcor() + 10 y = circ.ycor() + 10 circ.setx(x) circ.sety(y)
Игра с подсчетом ходов
import turtle def prepare_fig(fig, x, y): fig.hideturtle() fig.penup() fig.setposition(x, y) fig.speed(13) def draw_square(fig, color, side_length): fig.pendown() fig.fillcolor(color) fig.begin_fill() for i in range(4): fig.fd(side_length) fig.rt(90) fig.end_fill() def message(text, color): circ.hideturtle() circ.goto(0, 0) circ.color(color) sq.clear() sq2.clear() print(moves) circ.write(text, font=("Arial", 12, "bold")) def win_or_die(moves): if -20 < circ.xcor() < 40 and 10 < circ.ycor() < 70: message(GAME_OVER_MSG + str(moves), 'red') if -60 < circ.xcor() < -20 and 50 < circ.ycor() < 90: message(WIN_MSG + str(moves), 'green') def movey(deltay): global moves y = circ.ycor() + deltay circ.sety(y) moves += 1 win_or_die(moves) def movex(deltax): global moves x = circ.xcor() + deltax circ.setx(x) moves += 1 win_or_die(moves) wndow = turtle.Screen() wndow.title("Circle game") wndow.setup(500, 500) circ = turtle.Turtle() circ.penup() circ.shape("circle") circ.color("orange") sq = turtle.Turtle() prepare_fig(sq, -20, 70) draw_square(sq, 'red', 60) sq2 = turtle.Turtle() prepare_fig(sq2, -60, 90) draw_square(sq2, 'green', 40) moves = 0 GAME_OVER_MSG = 'Game over!\nСделано шагов: ' WIN_MSG = 'Победа!\nСделано шагов: ' STEP = 10 turtle.listen() turtle.onkeypress(lambda: movey(STEP), 'Up') turtle.onkeypress(lambda: movey(-STEP), 'Down') turtle.onkeypress(lambda: movex(STEP), 'Right') turtle.onkeypress(lambda: movex(-STEP), 'Left') turtle.done()
Всего 61 строка кода!
Ссылки
- Simple drawing with turtle
- Turtle Graphics in Python
- The Beginner's Guide to Python Turtle
- Turtle examples
- Give Python turtle a rectangular shape for ping pong game