
Создание игры. Знакомство с графикой
Лекция

Содержание лекции
- Рисование геометрических фигур и картинок из геометрических фигур.
- Работа с цветом.

Модули для работы с графикой
Внутренний функционал питона довольно мощный, и его вполне достаточно для реализации многих проектов. Однако Python не был бы таким популярным среди программистов, если бы не мог расширять свой функционал за счет дополнительных модулей (ещё их называют библиотеками или пакетами) с помощью всего лишь одной строчки кода.
Каждый существующий модуль написан для решения задач в конкретной области. Сегодня мы познакомимся с некоторыми модулями для работы с графикой.
- drawzero
- turtle
- Pillow (PIL)
- Matplotlib

Matplotlib
Библиотека Matplotlib — пакет для визуализации данных в Python, который позволяет работать с данными на нескольких уровнях:
- с помощью модуля Pyplot, который рассматривает график как единое целое;
- через объектно-ориентированный интерфейс, когда каждая фигура или её часть является отдельным объектом, — это позволяет выборочно менять их свойства и отображение.

Как связаны Matplotlib, Pyplot и Pylab
Библиотека Matplotlib — это пакет для визуализации данных в Python. Pyplot — это модуль в пакете Matplotlib. Его вы часто будете видеть в коде как matplotlib.pyplot. Модуль помогает автоматически создавать оси, фигуры и другие компоненты, не задумываясь о том, как это происходит. Именно Pyplot используется в большинстве случаев.
Pylab — это ещё один модуль, который устанавливается вместе с пакетом Matplotlib. Он одновременно импортирует Pyplot и библиотеку NumPy для работы с массивами в интерактивном режиме или для доступа к функциям черчения при работе с данными.
Сейчас Pylab имеет только историческое значение — он облегчал переход с MATLAB на Matplotlib, так как позволял обходиться без операторов импорта (а именно так привыкли работать пользователи MATLAB). Вы можете встретиться с Pylab в примерах кода на разных сайтах, но на практике использовать модуль не придётся.

Установка и импорт библиотеки
Matplotlib — универсальная библиотека, которая работает в Python на Windows, macOS и Linux. При работе с Google Colab или Jupyter Notebook устанавливать Python и Matplotlib не понадобится — язык программирования и библиотека уже доступны «из коробки».
Установка через терминал
pip3 install matplotlib
Импорт библиотеки
import matplotlib.pyplot as plt
Сокращение plt для библиотеки — общепринятое. Вы встретите его в официальной документации, книгах и в ноутбуках других людей.
![Строим первый график в Matplotlib Для начала создадим две переменные — x и y, которые будут содержать координаты точек по осям х и у, а также построим график, который соединит эти точки: import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [25, 32, 34, 20, 25] plt.plot(x, y, color='green', marker='o', markersize=7) plt.xlabel('Ось х') #Подпись для оси х plt.ylabel('Ось y') #Подпись для оси y plt.title('Первый график') #Название plt.show() plt.plot() — стандартная функция, которая строит график в соответствии со значениями, которые ей были переданы. Мы передали в неё координаты точек; plt.show() — функция, которая отвечает за вывод визуализированных данных на экран. Её можно и не указывать, но тогда, помимо красивой картинки, мы увидим разную техническую информацию.](http://fsd.mir-olymp.ru/html/2025/01/19/i_678cc9778c155/img_phpFNHpiL_6.jpg)
Строим первый график в Matplotlib
Для начала создадим две переменные — x и y, которые будут содержать координаты точек по осям х и у, а также построим график, который соединит эти точки:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [25, 32, 34, 20, 25]
plt.plot(x, y, color='green', marker='o', markersize=7)
plt.xlabel('Ось х') #Подпись для оси х
plt.ylabel('Ось y') #Подпись для оси y
plt.title('Первый график') #Название
plt.show()
plt.plot() — стандартная функция, которая строит график в соответствии со значениями, которые ей были переданы. Мы передали в неё координаты точек;
plt.show() — функция, которая отвечает за вывод визуализированных данных на экран. Её можно и не указывать, но тогда, помимо красивой картинки, мы увидим разную техническую информацию.
![Столбчатая диаграмма в Matplotlib Такой тип визуализации позволяет удобно сравнивать значения отдельных переменных. В столбчатой диаграмме длина столбцов пропорциональна показателям, которые они отображают. Как правило, одна из осей соответствует одной категории, а вторая — её дискретному значению. Например, столбчатая диаграмма позволяет наглядно показать величину прибыли по месяцам. Построим следующий график: import matplotlib.pyplot as plt x = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май'] y = [2, 4, 3, 1, 7] plt.bar(x, y, label='Величина прибыли') #Параметр label позволяет задать название величины для легенды plt.xlabel('Месяц года') plt.ylabel('Прибыль, в млн руб.') plt.title('Пример столбчатой диаграммы') plt.legend() plt.show()](http://fsd.mir-olymp.ru/html/2025/01/19/i_678cc9778c155/img_phpFNHpiL_7.jpg)
Столбчатая диаграмма в Matplotlib
Такой тип визуализации позволяет удобно сравнивать значения отдельных переменных. В столбчатой диаграмме длина столбцов пропорциональна показателям, которые они отображают. Как правило, одна из осей соответствует одной категории, а вторая — её дискретному значению.
Например, столбчатая диаграмма позволяет наглядно показать величину прибыли по месяцам. Построим следующий график:
import matplotlib.pyplot as plt
x = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май']
y = [2, 4, 3, 1, 7]
plt.bar(x, y, label='Величина прибыли') #Параметр label позволяет задать название величины для легенды
plt.xlabel('Месяц года')
plt.ylabel('Прибыль, в млн руб.')
plt.title('Пример столбчатой диаграммы')
plt.legend()
plt.show()
![Круговая диаграмма в Matplotlib Круговую диаграмму используют для отображения состава групп. Например, мы можем наглядно показать, какие марки автомобилей преобладают на дорогах города. Так информация нагляднее, но непонятно, какая именно доля приходится на каждую марку автомобиля. Поэтому круговые диаграммы всегда лучше дополнять значениями в процентах. Добавим к функции pie параметр autopct: import matplotlib.pyplot as plt vals = [24, 17, 53, 21, 35] labels = [](http://fsd.mir-olymp.ru/html/2025/01/19/i_678cc9778c155/img_phpFNHpiL_8.jpg)
Круговая диаграмма в Matplotlib
Круговую диаграмму используют для отображения состава групп. Например, мы можем наглядно показать, какие марки автомобилей преобладают на дорогах города.
Так информация нагляднее, но непонятно, какая именно доля приходится на каждую марку автомобиля. Поэтому круговые диаграммы всегда лучше дополнять значениями в процентах. Добавим к функции pie параметр autopct:
import matplotlib.pyplot as plt
vals = [24, 17, 53, 21, 35]
labels = ["Ford", "Toyota", "BMW", "Audi", "Jaguar"]
plt.pie(vals, labels=labels, autopct='%1.1f%%')
plt.title("Распределение марок автомобилей на дороге")
plt.show()
![Сложные визуализации в Matplotlib Построим столбчатый график с накоплением. Он позволяет оценить динамику соотношения значений одной переменной. Попробуем показать, как соотносится количество устройств на Android и iOS в разные годы. График позволяет увидеть, что соотношение устройств, работающих на Android и iOS, постепенно меняется — устройств на Android становится больше. import matplotlib.pyplot as plt labels = ['2017', '2018', '2019', '2020', '2021'] android _ users = [85, 85.1, 86, 86.2, 86] ios _ users = [14.5, 14.8, 13, 13.8, 14.0] width = 0.35 #Задаём ширину столбцов fig, ax = plt.subplots() ax.bar(labels, android _ users, width, label='Android') ax.bar(labels, ios _ users, width, bottom=android _ users, label='iOS') #Указываем с помощью параметра bottom, что значения в столбце должны быть выше значений переменной android _ users ax.set _ ylabel('Соотношение, в %') ax.set _ title('Распределение устройств на Android и iOS') ax.legend(loc='lower left', title='Устройства') #Сдвигаем легенду в нижний левый угол, чтобы она не перекрывала часть графика plt.show()](http://fsd.mir-olymp.ru/html/2025/01/19/i_678cc9778c155/img_phpFNHpiL_9.jpg)
Сложные визуализации в Matplotlib
Построим столбчатый график с накоплением. Он позволяет оценить динамику соотношения значений одной переменной. Попробуем показать, как соотносится количество устройств на Android и iOS в разные годы.
График позволяет увидеть, что соотношение устройств, работающих на Android и iOS, постепенно меняется — устройств на Android становится больше.
import matplotlib.pyplot as plt
labels = ['2017', '2018', '2019', '2020', '2021']
android _ users = [85, 85.1, 86, 86.2, 86]
ios _ users = [14.5, 14.8, 13, 13.8, 14.0]
width = 0.35 #Задаём ширину столбцов
fig, ax = plt.subplots()
ax.bar(labels, android _ users, width, label='Android')
ax.bar(labels, ios _ users, width, bottom=android _ users,
label='iOS') #Указываем с помощью параметра bottom, что значения в столбце должны быть выше значений переменной android _ users
ax.set _ ylabel('Соотношение, в %')
ax.set _ title('Распределение устройств на Android и iOS')
ax.legend(loc='lower left', title='Устройства') #Сдвигаем легенду в нижний левый угол, чтобы она не перекрывала часть графика
plt.show()

drawzero
drawzero — это простая и удобная графическая библиотека, в которой есть функции для рисования простых фигур. Чтобы получить к ним доступ, надо в начале программы написать строку.
Установка через терминал
pip3 install drawzero
Импорт библиотеки
from drawzero import *
Основы основ
Итак, приступим к рисованию!
Запустите программу ниже. В результате запуска должно открыться окно с нарисованной по диагонали красной линией.
from drawzero import *
line('red', (0, 0), (1000, 1000))

Осваиваем геометрию с помощью кода drawzero
Система координат в программировании и система координат в математике немного отличаются. В программировании точка с координатами (0, 0) находится в верхнем левом углу. Ось x направлена от неё вправо , а ось y — вниз .
Любая точка имеет позицию (координату) относительно оси x и относительно оси y, поэтому координаты каждой точки это пара чисел — сначала x, потом y. Эти координаты указываются через запятую и записываются в круглых скобках.
Рисование отрезка выполняется, как мы уже знаем, с помощью команды line . В скобках указываются параметры: цвет и две точки — концы отрезка. Именно в таком порядке.
Цвет пока можно выбирать из следующих вариантов: "black", "white", "red", "green", "blue", "yellow", "brown". Скоро мы научимся выбирать любые цвета.
from drawzero import *
line('red', (300, 200), (700, 400))
# 'red' — цвет линии,
# (300, 200) — один конец отрезка,
# (700, 400) — второй конец отрезка

Осваиваем геометрию с помощью кода drawzero
Рисование окружности выполняется с помощью команды circle . В скобках указываются параметры: цвет, координаты центра окружности и радиус:
from drawzero import *
circle('yellow', (500, 300), 200)
# 'yellow' — цвет окружности,
# (500, 300) — координаты центра окружности,
# 200 — радиус
Рисование прямоугольника выполняется с помощью команды rect . В скобках указываются параметры: цвет, координаты левой верхней вершины, ширина (вдоль оси x), высота (вдоль оси y). То есть, при помощи такой функции можно рисовать только прямоугольники, параллельные осям координат.
from drawzero import *
rect('blue', (300, 200), 400, 200)
# 'blue' — цвет,
# (300, 200) — координаты верхнего левого угла,
# 400 — ширина,
# 200 — высота

Создание более сложных фигур drawzero
Рисуя треугольник линиями, можно заметить, что каждую точку мы выписывали дважды, потому что она была концом двух отрезков. Может быть можно сделать то же самое экономнее?
Нам поможет функция рисования многоугольника polygon. Первый параметр это уже знакомый нам цвет, после которого надо перечислить координаты вершин многоугольника.
from drawzero import *
polygon('blue', (300, 200), (700, 300), (500, 400))
# 'blue' — цвет,
# (300, 200) — первая точка многоугольника,
# (700, 300) — вторая точка многоугольника,
# (500, 400) — третья точка многоугольника
Если в многоугольнике больше трёх вершин , нужно учесть, что перечислять вершины в произвольном порядке нельзя. Представьте, что вы обходите эту фигуру по часовой стрелке или против часовой стрелки. В функции polygon надо перечислять вершины одним из этих способов, начиная с любой вершины. Если порядок вершин неверный, то может получиться, например, что-то такое:

Создание более сложных фигур drawzero
Пока мы рисовали только контуры. Теперь научимся рисовать закрашенные фигуры. Это может быть круг, прямоугольник и многоугольник. Для получения закрашенной фигуры есть команды: filled _ circle, filled _ rect, filled _ polygon с такими же параметрами, как и у неокрашенных фигур.
from drawzero import *
filled _ circle("red", (550, 450), 50)
filled _ rect("green", (700, 200), 200, 200)
filled _ polygon("blue", (100, 100), (400, 200), (300, 300))

Использование переменных drawzero
Мы познакомились с основными возможностями библиотеки drawzero. Теперь пора вспомнить про переменные — они нам скоро пригодятся.
Попробуем нарисовать какую-нибудь простенькую фигуру, например прямоугольник с закруглёнными концами.
Координаты центра окружности это середины левой и правой (вертикальных) сторон прямоугольника и их можно посчитать. Это и правда несложно. Но что, если эту картинку надо перерисовать в другом месте или, скажем, сделать исходный прямоугольник чуть выше или шире? Это по-прежнему будет несложно сделать, но придётся пересчитывать координаты центров окружностей.
from drawzero import *
filled _ rect('yellow', (300, 500), 500, 100)
filled _ circle('yellow', (300, 550), 50)
filled _ circle('yellow', (800, 550), 50)
from drawzero import *
filled _ rect('yellow', (300, 500), 500, 150)
filled _ circle('yellow', (300, 575), 75)
filled _ circle('yellow', (800, 575), 75)
filled _ rect('yellow', (475, 325), 150, 500)
filled _ circle('yellow', (550, 325), 75)
filled _ circle('yellow', (550, 825), 75)

Использование переменных drawzero
Напишем ту же программу по шагам, но для вычисления координат станем использовать переменные. Что нам нужно знать об этой фигуре, для того, чтобы её нарисовать? Нам надо знать где она находится и её главные размеры.
Место можно задать по-разному. Мы запомним координаты левого верхнего угла. Размеры фигуры определяются размерами прямоугольника. А радиус круга это половина его высоты, поэтому размеров прямоугольника достаточно. Не поленимся ввести для радиуса отдельную переменную, код так будет лучше читаться.
left = 300
top = 500
w = 500
h = 150
r = h // 2
Очень полезно нарисовать картинку на бумаге и разобраться, откуда берутся формулы в программе, представленной ниже.
from drawzero import *
# left, top — координаты левого верхнего угла прямоугольника
left = 300
top = 500
# w, h — ширина и высота прямоугольника; r — радиус окружности
w = 500
h = 150
r = h // 2
filled _ rect('yellow', (left, top), w, h)
filled _ circle('yellow', (left, top + r), r)
filled _ circle('yellow', (left + w, top + r), r)
filled _ rect('yellow', (left + w // 2 - r, top - w // 2 + r), h, w)
filled _ circle('yellow', (left + w // 2, top - w // 2 + r), r)
filled _ circle('yellow', (left + w // 2, top + w // 2 + r), r)

Скруглим углы drawzero
Давайте теперь сделаем не такие острые углы. Нарисуйте такую картинку:
Только "скруглить" угол можно по-разному. В идеальной фоторамке ширина должна быть одинаковой и в углах тоже. Но как понять, что такое "ширина рамки в углу"?
Давайте так: ширина это расстояние от точки на внешней границы к ближайшей к ней точке на внутренней. Изучите картинку со схемой и вы поймёте, что надо нарисовать (и в какой последовательности).
А ещё хорошо бы сделать всё на белом фоне! Для того, чтобы залить весь экран одним цветом, используйте команду ` fill ` . Например, заливка красным выглядит так:
fill('red')
Работа с цветами drawzero
Каждый цвет состоит из трёх компонентов: красного, зелёного и синего. Наверняка вам встречалась аббревиатура RGB (сокращение от Red, Green и Blue).
Представьте, что в абсолютно тёмной комнате вы светите на стену тремя фонариками: красным, зелёным и синим. У каждого есть регулировка интенсивности — число от 0 (фонарик выключен) до 255 (фонарик светит максимально ярко). Все фонарики светят в одну и ту же точку стены и в зависимости от настроек интенсивности всех трёх фонариков на стене получается пятно определённого цвета. Вот несколько примеров:
- R = 0, G = 0, B = 0 — все фонарики выключены, на стене чёрное пятно (которое и так не видно, потому что в комнате темно);
- R = 255, G = 255, B = 255 — все фонарики включены на максимальную мощность, на стене яркое белое пятно;
- R = 100, G = 100, B = 100 — все фонарики включены, имеют одинаковую (но небольшую) интенсивность, на стене тёмно-серое пятно;
- R = 255, G = 0, B = 0 — красный фонарик включен полностью, остальные выключены, на стене яркое красное пятно;
- R = 255, G = 0, B = 255 — красный и синий фонарики включены полностью, зелёный выключен, на стене яркое фиолетовое пятно.
В библиотеке drawzero можно определить свой цвет при помощи тройки чисел, взятой в скобки. Эту тройку можно запомнить в переменной и использовать при вызове всех функций рисования из модуля drawzero.
Цвета, приведённые в примере выше можно было сохранить так:
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
violet = (255, 0, 255)

Работа с цветами drawzero
from drawzero import *
light _ blue = (73, 151, 231)
sand _ yellow = (244, 215, 111)
coral _ red = (245, 129, 129)
filled _ circle(coral _ red, (150, 150), 10)
filled _ rect(sand _ yellow, (200, 100, 50, 50))
filled _ polygon(light _ blue, (90, 100), (70, 120), (30, 80))

Рисуем геометрические фигуры в Python с помощью Pillow
Модуль ImageDraw из библиотеки обработки изображений Pillow (PIL) предоставляет методы для рисования круга, квадрата и прямой линии в Python.
Используя объекта Image мы создадим фоновое изображение на которой мы будем рисовать наши фигуры при помощи объекта Draw. Не забудьте импортировать модуль Image и ImageDraw в начале кода.
Здесь создается пустое изображение с размером 500 на 300 пикселей и с тёмно желтым фоном.
from PIL import Image, ImageDraw
# Пустой желтый фон.
im = Image.new('RGB', (500, 300), (219, 193, 27))
draw = ImageDraw.Draw(im)
im.show()

Рисуем фигуры в Pillow: ellipse, rectangle и line
Вызываем методы рисования из объекта Draw для рисования фигур на нашем желтом фоне.
Рисуем эллипс, прямоугольник и прямую линию в качестве примера.
from PIL import Image, ImageDraw
# Пустой желтый фон.
im = Image.new('RGB', (500, 300), (219, 193, 27))
draw = ImageDraw.Draw(im)
# Рисуем красный эллипс с черной оконтовкой.
draw.ellipse((100, 100, 150, 200), fill='red', outline=(0, 0, 0))
# Рисуем синий прямоугольник с белой оконтовкой.
draw.rectangle((200, 100, 300, 200), fill='blue', outline=(255, 255, 255))
# Рисуем розовую линию с шириной в 10 пиксель.
draw.line((350, 200, 450, 100), fill='pink', width=10)
im.save('draw-ellipse-rectangle-line.jpg', quality=95)

Справочник по параметрам методов рисования
Область рисования — xy
Параметр xy указывает прямоугольную область для рисования новой фигуры.
Уточняется один из следующих форматов:
- (((Верхняя левая x координата, Верхняя левая y координата), (нижняя правая x координата, нижняя правая y координата));
- (Верхняя левая x координата, Верхняя левая y координата, нижняя правая x координата, нижняя правая y координата).
В методах line(), polygon() и point() используются многочисленные координаты вместо двух точек, представляющих прямоугольную область.
- (x1, y1, x2, y2, x3, y3...);
- ((x1, y1), (x2, y2), (x3, y3)...).
Метод line() рисует прямую линию, которая связывает каждую точку, polygon() рисует многоугольник, а метод point() рисует точку в 1 пиксель для каждой указанной точки.

Справочник по параметрам методов рисования
Параметр fill — заполняем фигуру определенным цветом
Параметр fill указывает какой цвет будет использован для заполнения нашей геометрической формы.
Спецификация формата цвета отличается в зависимости от указанного режима изображения (объект Image):
- RGB: Указывает значение цвета в форме (R, G, B);
- L (Черно-белое): Указывает значение (0-255) как целое число).
Значение по умолчанию None (не заполнено).
Есть три способа указать цвет, возьмем красный цвет, его можно записать так:
- текстовый формат: red;
- CSS формат (Шестнадцатеричный): #FF0000
- RGB: (255, 0, 0)

Справочник по параметрам методов рисования
Параметр outline — цвет границ
Параметр outline указывает на цвет границы фигуры.
Спецификация формата цвета такая же, как и у параметра fill которого мы обсуждали выше. Значение по умолчанию равно None (без границ).
Вне зависимости от рисуемой фигуры, вы можете указать размер в пикселях для границы фигуры.
Параметр outline — цвет границ

Рисование эллипса и прямоугольника в Python
Эллипс (Круг): ellipse(xy, fill, outline);
Прямоугольник (Квадрат): rectangle(xy, fill, outline).
Метод ellipse() рисует эллипс, область рисования указывается в параметр xy. Если мы зададим четыре координата которые будут соответствовать квадрату, то у нас получится ровный круг.
Нарисуем небольшой смайл используя круги.
from PIL import Image, ImageDraw
image = Image.new('RGB', (90, 90), 'white')
draw = ImageDraw.Draw(image)
draw.ellipse((0, 0, 90, 90), 'yellow', 'blue')
draw.ellipse((25, 20, 35, 30), 'yellow', 'blue')
draw.ellipse((50, 20, 60, 30), 'yellow', 'blue')
draw.arc((20, 40, 70, 70), 0, 180, 0)
image.save('draw-smile.jpg')
Image.show()

Рисование линии, многоугольника и точки в Python
Линия: line(xy, fill, width):
Параметр xy
- Указывает несколько координат двух или более точек как ((x1, y1), (x2, y2), (x3, y3)...);
- Рисуются линии, связывающие каждую точку между собой.
width: Ширина линии в пикселях
- Обратите внимание, что если вы сделаете ширину линии толще c помощью width, указывая 3 точки или более через параметр xy, тогда соединительная линия между ними будет выглядеть не очень аккуратно.
Многоугольник: polygon(xy, fill, outline):
Параметр xy
- Указывается несколько координат, трех или более точек как ((x1, y1), (x2, y2), (x3, y3)...);
- Рисуется многоугольник, в котором каждая точка соединяется между собой при помощи линии.
Точка: point(xy, fill):
Параметр xy
- Указывается несколько координат одной или более точек как ((x1, y1), (x2, y2), (x3, y3)...);
- Одна точка (в размере одного пикселя) рисуется для каждого координата.

Рисование линии, многоугольника и точки (пример)
from PIL import Image, ImageDraw
# Пустой желтый фон.
im = Image.new('RGB', (500, 300), (219, 193, 27))
draw = ImageDraw.Draw(im)
# Три черные линии в шириной в 1 пиксель.
draw.line(
xy=((30, 200),(130, 100),(80, 50)), fill='black')
# Три красные линии с размером в 5 пикселей.
draw.line(
xy=((80, 200),(180, 100),(130, 50)), fill='red', width=10)
# Имея три точки и связь между ними, у нас получится синий триугольник.
draw.polygon(
xy=((200, 200),(300, 100),(250, 50)), fill='blue', outline=(0, 0, 0))
# Рисуем три точки.
draw.point(
xy=((350, 200),(450, 100),(400, 50)), fill='black')
im.save('draw-dots.jpg', quality=95)

Рисуем дугу, хорды и пироги в Pillow
Дуга: arc(xy, start, end, fill):
Параметры start и end – указание угла дуги в градусах;
Хорда: chord(xy, start, end, fill, outline):
Начальные и конечные точки дуги связываются прямой линией.
Пирог: pieslice(xy, start, end, fill, outline):
Начальные и конечные точки дуги связываются прямой линией с центром круга.
from PIL import Image, ImageDraw
# Пустой желтый фон .
im = Image.new('RGB', (610, 240), (219, 193, 27))
draw = ImageDraw.Draw(im)
# Рисуем дугу.
draw.arc(xy=(25, 50, 175, 200),start=30, end=270,fill='red')
# Рисуем хорду.
draw.chord(xy=(225, 50, 375, 200),start=30, end=270, fill=(255, 255, 0),outline=(0, 0, 0))
# Рисуем "кусок пирога".
draw.pieslice(xy=(425, 50, 575, 200),start=30, end=270, fill=(255, 255, 0),outline=(0, 0, 0))
im.save('draw-arc.jpg', quality=95)

«Черепашья графика» при помощи turtle
Черепашья графика, turtle – принцип организации библиотеки графического вывода, построенный на метафоре Черепахи, воображаемого роботоподобного устройства, которое перемещается по экрану или бумаге и поворачивается в заданных направлениях, при этом оставляя (или, по выбору, не оставляя) за собой нарисованный след заданного цвета и ширины.
Проще: черепашка ползает по экрану и рисует. Мы управляем черепашкой на плоскости при помощи программы.
Мы командуем черепашкой простыми словами на английском языке. left, right – поворот налево и направо, forward и backward – движение вперед и назад. В программе каждое действие – вызов функции из модуля turtle. Простая программа:
Импорт библиотеки
import turtle
Что произошло:
- Поворот направо на 90 градусов
- Движение вперед на 100 шагов (пикселей)
- Поворот налево на 90 градусов
- Движение назад на 100 шагов
import turtle
turtle.right(90)
turtle.forward(100)
turtle.left(90)
turtle.backward(100)

Это же «стрелка», а не «черепашка»
Не похоже на черепашку, это ползающая стрелка! Исправим это:
Отлично! Теперь это черепашка, пусть и монохромная. Дополнительно, функция exitonclick( ) позволяет закрыть окно и завершить выполнение программы кликом мышкой по окну.
А еще можно использовать сокращенные названия функций: fd(100) вместо forward(100), rt вместо right, lt вместо left, bk вместо backward.
import turtle
turtle.shape("turtle")
turtle.fd(100)
turtle.exitonclick()

Геометрические фигуры
Рисуем простые геометрические фигуры:
- Прямая: просто движение вперед
- Квадрат: вперед, поворот на 90 градусов и так 4 раза. Повторение команд – значит, можно выполнить их в цикле for!
- Пятиконечная звезда: вперед, поворот на 144 градусов и так 5 раз.
Если мы хотим выполнить инструкции n раз, мы пишем их в цикле
Далее идут инструкции с отступом в 4 пробела. Код с отступами – тело цикла. Когда цикл завершается, отступы больше не ставятся.
for i in range(n):
import turtle
square = turtle.Turtle()
square.shape("turtle")
for i in range(4):
square.forward(100)
square.right(90)
turtle.exitonclick()

Изменяем параметры во время движения
При отрисовке простых фигур черепашка возвращалась в исходную точку, и программа останавливалась, ожидая, когда будет закрыто окно. Если в цикле продолжить рисовать по прежним инструкциям, фигура будет нарисована заново по уже нарисованным контурам.
Мы также добавили:
- color('red', 'green') определяет цвет линии и цвет заполнения. Черепашка теперь зеленая!
- begin _ fill() и end _ fill() обозначают начало и конец заполнения
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()

Координаты на плоскости
Положение на плоскости определяется двумя числами, x и y:
Черепашку в программе можно перемещать функцией goto(x, y) . x и y – числа, или переменные. goto(0, 0) переместит черепашку в начало координат.
Вместо звезды-спирали мы получили 5 линий, расходящихся из точки начала координат.
import turtle
spiral = turtle.Turtle()
for i in range(20):
spiral.fd(i * 10)
spiral.rt(144)
spiral.goto(0,0)
turtle.exitonclick()

Круг и точка
Не хватает плавных изгибов? На помощь приходят функции dot() и circle():
Дополнительно мы:
- изменили заголовок окна функцией title(),
- установили толщину линии – pensize(),
- установили цвет линии – pencolor(),
- Подняли черепашку перед перемещением – penup() и опустили после – pendown().
import turtle
turtle.title("Turtle Drawing")
circle = turtle.Turtle()
circle.shape("turtle")
circle.pensize(5)
circle.pencolor("cyan")
circle.penup()
circle.goto(0, -100)
circle.pendown()
circle.circle(100)
turtle.exitonclick()

Любые фигуры
import turtle
turtlePen = turtle.Turtle()
window = turtle.Screen()
turtlePen.forward(30)
turtlePen.left(90)
turtlePen.forward(30)
turtlePen.right(90)
turtlePen.forward(30)
turtlePen.left(90)
turtlePen.forward(30)
turtlePen.right(90)
turtlePen.forward(30)
turtlePen.left(90)
turtlePen.forward(30)
turtlePen.right(90)
turtlePen.forward(30)
window.mainloop()
import turtle
turtlePen = turtle.Turtle()
window = turtle.Screen()
def polygon(n, size=80):
if n 2:
angle = 360 / n
for n in range(0, n):
turtlePen.left(angle)
turtlePen.forward(size)
# рисуем разные фигуры
polygon(3)
polygon(4)
polygon(5)
polygon(6)
import turtle
turtlePen = turtle.Turtle()
window = turtle.Screen()
def polygon(n, size=80):
if n 2:
angle = 360/n
for n in range(0, n):
turtlePen.left(angle)
turtlePen.forward(size)
turtlePen.speed(10)
for i in range(0, 100, 5):
polygon(3, 10 + i)
turtlePen.left(20)
window.mainloop()
import turtle
turtlePen = turtle.Turtle()
window = turtle.Screen()
turtlePen.left(90)
turtlePen.forward(80)
turtlePen.left(90)
turtlePen.forward(80)
turtlePen.left(90)
turtlePen.forward(80)
turtlePen.left(90)
turtlePen.forward(80)
window.mainloop()
import turtle
turtlePen = turtle.Turtle()
window = turtle.Screen()
turtlePen.left(120)
turtlePen.forward(80)
turtlePen.left(120)
turtlePen.forward(80)
turtlePen.left(120)
turtlePen.forward(80)
window.mainloop()

import turtle
turtlePen = turtle.Turtle()
window = turtle.Screen()
window.bgcolor("black")
def polygon(n, size=80):
if n 2:
angle = 360 / n
for n in range(0, n):
turtlePen.left(angle)
turtlePen.forward(size)
turtlePen.speed(100)
colors = ['orange', 'cyan', 'blue', 'green', 'red']
size = 40
for i in range(0, 60):
turtlePen.color(colors[i % 5])
polygon(4, size)
turtlePen.left(5)
size = size + 3
window.mainloop()
Используем цвета
Фон окна можно изменить командой bgcolor , куда передаем имя текста в виде строки:
Аналогично при помощи команды color указываем цвет для рисования:
Цвет можно менять и во время рисования. Для этого создадим массив цветов и в зависимости от значения цикла (или иных параметров) будем менять цвет линий.
window.bgcolor("red")
window.bgcolor("red")

Напоследок вспомним о кругах
Ведь наша программа рисует только многоугольники. И хотя можно указать какой-то 40-угольник, который в итоге даже будет похож на круг:
В программе есть для этого отдельная функция: circle. И заменив функцию polygon в цикле отрисовки:
for i in range(0, 70):
turtlePen.color("white")
turtlePen.circle(size)
turtlePen.left(5)
size = size + 3