Компания ALT Linux
Опубликован: 05.04.2015 | Доступ: свободный | Студентов: 2481 / 467 | Длительность: 05:48:00
ISBN: 978-5-905167-02-7
Специальности: Программист, Преподаватель
Лекция 3:

Графика в Python и задачи моделирования

< Лекция 2 || Лекция 3: 12 || Лекция 4 >
Аннотация: Python может работать с несколькими графическими библиотеками, обеспечивая создание сложных приложений с развитым графическим пользовательским интерфейсом. В этой части мы научимся пользоваться самыми простыми графическими возможностями Python — управлять исполнителем "черепашка" для создания графических примитивов и перемещаться на плоскости и использовать методы модуля Tkinter для задач моделирования математических функций и физических явлений.

3.1 Управление исполнителем "черепашка"

Исполнитель "черепашка" управляется командами относительных ("вперёд- назад" и "направо-налево") и абсолютных ("перейти в точку с координатами...") перемещений. Исполнитель представляет собой "перо", оставляющее след на плоскости рисования. Перо можно поднять, тогда при перемещении след оставаться не будет. Кроме того, для пера можно установить толщину и цвет. Все эти функции исполнителя обеспечиваются модулем turtle ("черепаха").

Приведённый ниже код создаёт графическое окно (рис. 3.1) и помещает перо ("черепашку") в исходное положение.

# -*- coding: utf-8 -*-

  import turtle

# Инициализация
turtle.reset()
# Здесь могут быть вычисления и команды рисования
# turtle._root.mainloop() # для Python 2.4.x и 2.5.x
# Эта команда показывает окно, пока его не закроют
turtle.mainloop() # для Python 2.6.x

Как видно из этого примера, способ вызова метода mainloop() для показа графического окна зависит от версии Python. Поэтому если не работает один вариант, смело используйте другой. В остальных примерах будет использоваться вариант для Python 2.6.

Окно рисования модуля turtle

Рис. 3.1. Окно рисования модуля turtle

Полученное окно имеет фиксированный размер, который зависит от версии Python, перо позиционируется в центре. Идея рисования заключается в перемещении пера ("черепашки") в точки окна рисования с указанными координатами или в указанных направлениях на заданные расстояния, а также в проведении отрезков прямых, дуг и окружностей.

Текущее направление перемещение пера (соответствующее направлению "вперёд") указывается остриём стрелки изображения "черепашки".

Полный список команд управления "черепашкой" (и, соответственно, рисования), а также функций, обеспечиваемых модулем, можно получить, набрав в окне выполнения любой системы программирования на Python команду help('turtle').

Список этот довольно длинный, а среди предоставляемых функций имеются также математические, поскольку они могут быть востребованы при вычислении параметров отрезков, дуг и окружностей.

Команды, обеспечивающие рисование, приведены ниже.

Команда Назначение Пример
up() Поднятие "пера", чтобы не оставалось следа его при перемещении turtle.up()
down() Опускание "пера", чтобы при перемещении оставался след (рисовались линии) turtle.down()
goto(x,y) Перемещение "пера" в точку с координатами x,y в системе координат окна рисования turtle.goto(50,20)
color ('цвет') Установка цвета "пера" в значение, определяемое строкой цвета
turtle.color('blue')
turtle.color('#0000ff')
width(n) Установка толщины "пера" в точках экрана turtle.width(3)
forward(n) Передвижение "вперёд" (в направлении острия стрелки, см. рис. 3.1) на n точек turtle.forward(100)
backward(n) Передвижение "назад" на n точек turtle.backward(100)
right(k) Поворот направо (по часовой стрелке) на k единиц turtle.right(75)
left(k) Поворот налево (против часовой стрелки) на k единиц turtle.left(45)
radians () Установка единиц измерения углов в радианы turtle.radians()
degrees () Установка единиц измерения углов в градусы (включён по умолчанию) turtle.degrees()
circle(r) Рисование окружности радиусом |r| точек из текущей позиции "пера". Если r положительно, окружность рисуется против часовой стрелки, если отрицательно — по часовой стрелке.
turtle.circle(40)
turtle.circle(-50)
circle(r,k) Рисование дуги радиусом |r| точек и углом k единиц. Вариант команды circle()
turtle.circle(40,45)
turtle.circle(-50,275)
fill (flag) В зависимости от значения flag включается (flag=1) и выключается (flag=0) режим закрашивания областей. По умолчанию выключен. Круг:
turtle.fill(1)
turtle.circle(-50)
turtle.fill(0)
write ('строка') Вывод текста в текущей позиции пера turtle.write('Начало координат!')
tracer(flag) Включение (flag=1) и выключение (flag=0) режима отображения указателя "пера" ("черепашки"). По умолчанию включён. turtle.tracer(0)
clear() Очистка области рисования turtle.clear(0)

При выключенном режиме отображения указателя "черепашки" рисование происходит значительно быстрее, чем при включённом.

Нужно заметить, что хотя углы поворота исполнителя изначально интерпретируются в градусах, при использовании тригонометрических функций модуля turtle (например, turtle.sin()) аргументы этих функций воспринимаются как радианы.

Проделаем упражнение с целью определить систему координат окна рисования. Приведённый ниже код формирует картинку, показанную на рис. 3.2.

# -*- coding: utf-8 -*-

  import turtle

#
turtle.reset()
turtle.tracer(0)
turtle.color('#0000ff')
#
turtle.write('0,0')
#
turtle.up()
x=-170
y=-120
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
x=130
y=100
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
x=0
y=-100
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
turtle.down()
x=0
y=100
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
turtle.up()
x=-150
y=0
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
turtle.down()
x=150
y=0
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
turtle.mainloop()
Система координат окна рисования

Рис. 3.2. Система координат окна рисования

Здесь строка с координатами формируется "в лоб", путём конкатенации преобразованных в строки значений координат.

Картинка, показанная на рис. 3.3, сформирована нижеследующим кодом.

# -*- coding: utf-8 -*-

  import turtle

#
turtle.reset()
turtle.tracer(0)
turtle.width(2) 
#
turtle.up()
x=0
y=-100
turtle.goto(x, y)
turtle.fill(1)
turtle.color('#ffaa00')
turtle.down()
turtle.circle(100)
turtle.fill(0)
turtle.color('black')
turtle.circle(100)
turtle.up() 
#
x=-45
y=50
turtle.goto(x, y)
turtle.down()
turtle.color('#0000aa')
turtle.fill(1)
turtle.circle(7)
turtle.up()
turtle.fill(0) 
#
x=45
y=50
turtle.goto(x, y)
turtle.down()
turtle.color('#0000aa')
turtle.fill(1)
turtle.circle(7)
turtle.up()
turtle.fill(0) 
#
x=-55
y=-50
turtle.goto(x, y)
turtle.right(4 5)
turtle.width(3)
turtle.down()
turtle.color('#aa0000')
turtle.circle(80, 90)
turtle.up()
#
turtle.right(135)
x=0
y=50
turtle.goto(x, y)
turtle.width(2)
turtle.color('black')
turtle.down()
turtle.forward(100)
#
turtle.mainloop()
Пример формирования изображения

Рис. 3.3. Пример формирования изображения

Для того, чтобы изобразить улыбку, потребовалось после перемещения пера в начальную точку дуги (левую) повернуть перо на 45 градусов. Дело в том, что изначально направлением "вперёд" для пера является направление вправо (как показано на рис. 3.1). Окружности и дуги рисуются как касательные к этому "вектору", начинаясь в точке с текущими координатами пера. Поэтому для улыбки потребовалось изменить направление "вектора".

Далее, перо, первоначально сориентированное на 45 градусов вправо, после прохождения дуги в 90 градусов соответственно изменило своё направление. Поэтому для получения вертикальной линии его пришлось дополнительно повернуть.

Можно поэкспериментировать с рисованием домиков, солнышка и более сложных композиций. Однако для формирования сложных кривых (например, графиков функций) с помощью этого модуля придётся многократно выполнять команду goto(x,y). В этом легко убедиться, попытавшись нарисовать, например, график параболы.

3.1.1 Задания и упражнения

  1. Как в примерах кода, формирующего изображения на рис. 3.2 и рис. 3.3, применить кортежи?
  2. Напишите код для создания изображения "домика" (квадрат под треугольником) без подъёма пера при условии однократного перемещения по каждой линии.
  3. Рассчитайте координаты и напишите код для создания изображения "солнца" (круг и расходящиеся от него отрезки) так, чтобы "лучи" начинались на расстоянии 2 точки от круга (не менее 8-ми лучей).
  4. Напишите код для построения графика степенной функции (y=ax^b) с началом координат в левой нижней четверти окна рисования так, чтобы кривая проходила практически через всё окно.
< Лекция 2 || Лекция 3: 12 || Лекция 4 >
Ольга Курыло
Ольга Курыло
Александр Кудлаев
Александр Кудлаев

Ознакомился с курсом "Практика по алгоритмизации и программированию на Python". Хотел сдать экзамен. Вместо традиционного тестирования было предложено написать курсовую работу. Написал. Отослал.Ответ на следующий день: "Задание не прверено". Сколько ожидать результата проверки работы?