Глава 4 Объекты и графика.ppt
- Количество слайдов: 56
Программирование на Python’е: Введение в информатику Глава 4 Объекты и графика Python Programming, 2/e 1
Задачи n n n Понять концепцию объектов и того как их можно использовать для упрощения программ. Познакомиться с различными объектами из графической библиотеки. Научиться создавать объекты в программах и вызывать нужные методы для выполнения наглядных вычислений. Python Programming, 2/e 2
Задачи (продолжение) n n Понять фундаментальные концепции компьютерной графики, в особенности роли координатной системы и преобразования координат. Понять как работать с мышью и с текстовым вводом данных в контексте графического программирования. Python Programming, 2/e 3
Задачи (продолжение) n Научиться писать простые интерактивные графические программы, используя графическую библиотеку. Python Programming, 2/e 4
Обзор n n Каждый тип данных может представлять определённое множество значений, с которым связано множество операций. Традиционный подход к программированию заключается в том, что данные пассивны – они обрабатываются и комбинируются активными операциями. Python Programming, 2/e 5
Обзор n n n Современные компьютерные программы создаются на основе объектноориентированного подхода. Большинство приложений, с которыми вы знакомы, имеют графический интерфейс пользователя, который предоставляет окна, пиктограммы, кнопки и меню. Графическая библиотека graphics. py написана специально для этого курса. Она основана на пакете tkinter. Python Programming, 2/e 6
Объекты из объектов n n n Основная идея ООП – рассматривать сложную систему как взаимодействие более простых объектов. Объект это разновидность активных данных, нечто соединяющее в себе и данные и операции. Объекты содержат данные (имеют качественные и количественные характеристики) и обладают функциональностью (выполняют операции). Объекты взаимодействуют, посылая другу сообщения. Python Programming, 2/e 7
Объекты из объектов n n Допустим мы хотим разработать информационную систему для колледжа или университета. Мы должны хранить записи о студентах, которые посещают занятия. Каждый студент будет представлен как объект. Python Programming, 2/e 8
Объекты из объектов n Объект-студент должен содержать такие данные: n n n Имя ID номер Пройденные курсы Адрес общежития Домашний адрес др. Python Programming, 2/e 9
Объекты из объектов n n n Объект-студент должен также отвечать на запросы. Мы можем захотеть послать электронное письмо-приглашение всем студентам, для этого нам нужен домашний адрес каждого студента. Мы могли бы послать print. Home. Address каждому объекту-студенту. Когда объектстудент получает сообщение, он печатает свой собственный домашний адрес. Python Programming, 2/e 10
Объекты из объектов n n Объект может ссылаться на другие объекты. Каждый курс может быть представлен объектом: n Инструктор n Расписание n Обязательные требования курсов n Где и когда встречается класс Python Programming, 2/e 11
Объекты из объектов n Стандартные операции n n add. Student del. Student change. Room и др. Python Programming, 2/e 12
Простое программирование графических данных n n Эта глава использует библиотеку graphics. py , поставляемую с дополнительными учебными материалами. Два возможных местоположения n n В каталоге Lib, содержащемся в установочном каталоге Python’а, с другими библиотеками. В той же папке, что и ваши программы с использованием графики. Python Programming, 2/e 13
Простое программирование графических данных n n Так как это библиотека, то её нужно импортировать командой >>> import graphics Окно для графики это отмеченное место на экране, отведённое для нашей графики. >>> win = graphics. Graph. Win() n Эта команда создаёт новое окно, озаглавленное "Окно для графики". Python Programming, 2/e 14
Простое программирование графических данных n n Graph. Win это объект, назначенный переменной win. Мы можем работать с окном посредством этой переменной точно так, как мы работаем с файлом посредством файловой переменной. Окно можно закрыть/уничтожить, написав команду >>> win. close() Python Programming, 2/e 15
Простое программирование графических данных n n Довольно нудно постоянно писать graphics. Для доступа к подпрограммам из графической библиотеки можно написать from graphics import * Оператор "from" позволяет вам загружать функции из библиотечного модуля. Знак "*" делает доступными все функции. Вместо "*" вы можете перечислить только нужные вам функции. Python Programming, 2/e 16
Простое программирование графических данных n В последнем случае вам не нужно будет приписывать командам из библиотеки ссылку graphics. >>> from graphics import * >>> win = Graph. Win() Python Programming, 2/e 17
Простое программирование графических данных n n n Графическое окно это набор точек, называемых пикселами (picture elements). По умолчанию окно Graph. Win составляет 200 пиксел в высоту на 200 пиксел в длину (всего 40, 000 пиксел). Нарисовать картинку в окне можно задавая по пикселу за раз, что довольно утомительно. Графическая библиотека содержит большое число подпрограмм, рисующих графические фигуры. Python Programming, 2/e 18
Простое программирование графических данных n n Простейший объект это точка (Point). Как и в геометрии местоположение точки задаётся в координатной системе парой (x, y), где x задаёт положение по горизонтали, а y положение точки по вертикали. Точка начала (0, 0) в графическом окне расположена в левом верхнем углу. Значения x возрастают слева направо, значения y сверху вниз. Координаты нижнего правого угла (199, 199) Python Programming, 2/e 19
Простое программирование графических данных >>> 50 >>> 60 >>> >>> p = Point(50, 60) p. get. X() p. get. Y() win = Graph. Win() p. draw(win) p 2 = Point(140, 100) p 2. draw(win) Python Programming, 2/e 20
Простое программирование графических данных >>> ### Открываем графическое окно >>> win = Graph. Win(‘Фигуры') >>> ### Рисуем красный круг с центром в точке (100, 100) с радиусом 30 >>> center = Point(100, 100) >>> circ = Circle(center, 30) >>> circ. set. Fill('red') >>> circ. draw(win) >>> ### Ставим текстовую подпись в центр круга >>> label = Text(center, "Красный круг") >>> label. draw(win) >>> ### Чертим квадрат, используя объектквадрат >>> rect = Rectangle(Point(30, 30), Point(70, 70)) >>> rect. draw(win) >>> ### Чертим отрезок, используя объект-прямую >>> line = Line(Point(20, 30), Point(180, 165)) >>> line. draw(win) >>> ### Чертим овал, используя объект-овал >>> oval = Oval(Point(20, 150), Point(180, 199)) >>> oval. draw(win) Python Programming, 2/e 21
Использование графических объектов n n Вычисления выполняются заблаговременно, чтобы выполнить необходимые операции. В предыдущем примере мы работали с объектами, созданными с помощью Graph. Win, Point, Circle, Oval, Line, Text и Rectangle. Все они являются примерами классов. Python Programming, 2/e 22
Использование графических объектов n n Каждый объект является экземпляром класса. Класс описывает свойства экземпляра. Если мы говорим, что Sharik это собака, то мы в действительности говорим, что Sharik это конкретная особь большего класса всех собак. Sharik это экземпляр из класса собак. Python Programming, 2/e 23
Использование графических объектов n Чтобы создать новый экземпляр класса, мы используем специальную операцию, называемую конструктором.
Использование графических объектов n n p = Point(50, 60) Конструктор для класса Point требует два параметра координаты x и y точки в окне. Эти значения хранятся как переменные экземпляра внутри объекта. Python Programming, 2/e 25
Использование графических объектов n Показаны только самые значимые переменные экземпляра (прочие включают цвет, содержащее окно и т. п. ) Python Programming, 2/e 26
Использование графических объектов n n Чтобы объект выполнил операцию, мы посылаем объекту сообщение. Множество сообщений, на которые отвечает объект называется методами объекта. Методы как функции, которые живут внутри объекта. Методы вызываются с помощью точечной нотации: <объект>. <имя метода>(<парам 1>, <парам 2>, …) Python Programming, 2/e 27
Использование графических объектов n p. get. X() и p. get. Y() возвращает координаты x и y точки. Функции такие как эти называются функциями доступа, потому что они позволяют нам получить данные от переменной экземпляра класса. Python Programming, 2/e 28
Использование графических объектов n n n Другие методы изменяют состояние объекта, изменяя значения переменных объекта. Метод move(dx, dy) двигает объект на dx единиц в направлении x и на dy единиц в направлении y. Метод move стирает старый образ и прорисовывает его в новом положении. Методы, изменяющие состояние, называются модификаторами. Python Programming, 2/e 29
Использование графических объектов >>> circ = Circle(Point(100, 100), 30) >>> win = Graph. Win() >>> circ. draw(win) n n n Первая строка создаёт круг радиуса 30 с центром в (100, 100). Мы использовали конструктор класса Point, чтобы задать центр круга. Последняя строка кода это запрос к объекту Circle с именем circ нарисовать себя в окне объекта win класса Graph. Win. Python Programming, 2/e 30
Использование графических объектов n Метод draw использует данные о центре и радиусе круга из переменной экземпляра. Python Programming, 2/e 31
Использование графических объектов n Две разные переменные могут ссылаться на один объект. Изменения, сделанные с помощью одной переменной, будут видны и на другой. >>> >>> >>> n left. Eye = Circle(Point(80, 50), 5) left. Eye. set. Fill('yellow') left. Eye. set. Outline('red') right. Eye = left. Eye right. Eye. move(20, 0) Идея заключается в том, чтобы создать левый глаз, скопировать его как правый глаз и сдвинуть правый глаз на 20 единиц. Python Programming, 2/e 32
Использование графических объектов n n Присваивание right. Eye = left. Eye заставляет right. Eye и left. Eye ссылаться на один и тот же круг! Ситуация, когда две переменные ссылаются на один объект называется совмещением (aliasing). Python Programming, 2/e 33
Использование графических объектов Python Programming, 2/e 34
Использование графических объектов n n Существует два способа исправить положение. Можно сделать два различных круга по одному для каждого глаза: >>> >>> >>> left. Eye = Circle(Point(80, 50), 5) left. Eye. set. Fill('yellow') left. Eye. set. Outline('red') right. Eye = Circle(Point(100, 50), 5) right. Eye. set. Fill('yellow') right. Eye. set. Outline('red') Python Programming, 2/e 35
Использование графических объектов В графической библиотеке есть лучшее решение. У графических объектов есть метод clone, который делает копии объектов. >>> >>> # Правильный способ создать два круга, # используя метод clone left. Eye = Circle(Point(80, 50), 5) left. Eye. set. Fill('yellow') left. Eye. set. Outline('red') right. Eye = left. Eye. clone() # right. Eye есть точная копия left. Eye right. Eye. move(20, 0) Python Programming, 2/e 36
Графическое изображение программы "Будущее значение". Выбор координат Python Programming, 2/e 37
Графическое изображение программы "Будущее значение". Выбор координат Python Programming, 2/e 38
Интерактивная графика n n В среде с графическим интерфейсом пользователь обычно взаимодействует со своими приложениями щелкая по кнопкам, выбирая пункты меню, впечатывая данные в текстовые поля на экране монитора. Управляемое событиями программирование рисует элементы интерфейса виджеты (window gadgets) на экране и затем ожидает действий пользователя. Python Programming, 2/e 39
Интерактивная графика n n n Событие сгенерировано как только пользователь двигает мышь, щелкает мышью, или печатает на клавиатуре. Событие это объект, который инкапсулирует данные о том, что только что случилось. Событийный объект посылается в соответствующую часть программы для обработки, например, кнопочное событие. Python Programming, 2/e 40
Интерактивная графика Графический модуль скрывает лежащее в основе, низкоуровневое управление окнами и предоставляет два простых способа получить ввод пользователя в окно Graph. Win. Python Programming, 2/e 41
Получение щелчков мыши n n n Мы можем получить графические данные от пользователя с помощью метода get. Mouse класса Graph. Win. Если вызывается метод get. Mouse объекта класса Graph. Win, то программа делает паузу и ждёт щелчка пользователя гденибудь в окне. Точка щелчка пользователя возвращается как объект класса Point. Python Programming, 2/e 42
Получение щелчков мыши n Следующий код сообщает координаты щелчка мыши: from graphics import * win = Graph. Win( «Щелкни по мне!") p = win. get. Mouse() print("You clicked", p. get. X(), p. get. Y()) n Мы можем воспользоваться функциями доступа, такими как get. X и get. Y или другими методами применимыми к возвращенной точке. Python Programming, 2/e 43
Получение щелчков мыши # triangle. pyw # Интерактивная программа с графическим интерфейсом для # рисования треугольника from graphics import * def main(): win = Graph. Win("Рисуем треугольник") win. set. Coords(0. 0, 10. 0) message = Text(Point(5, 0. 5), "Щелкни по трём точкам") message. draw(win) # Получи и нарисуй три вершины треугольника p 1 = win. get. Mouse() p 1. draw(win) p 2 = win. get. Mouse() p 2. draw(win) p 3 = win. get. Mouse() p 3. draw(win) Python Programming, 2/e 44
Получение щелчков мыши # Используем объект Polygon для рисования треугольника triangle = Polygon(p 1, p 2, p 3) triangle. set. Fill("peachpuff") triangle. set. Outline("cyan") triangle. draw(win) # Ждем еще щелчок, чтобы выйти message. set. Text("Щелкните где-либо для выхода. ") win. get. Mouse() main() Python Programming, 2/e 45
Получение щелчков мыши Python Programming, 2/e 46
Получение щелчков мыши n Замечания: n n Если вы программируете в оконной среде, использование расширения. pyw в ваших файлах будет причиной того, что оболочка Python’а ничего не будет показывать, когда вы щелкаете по пиктограмме программы. У нас нет класса треугольников. Мы используем общий класс многоугольников, объекты которого принимают любое количество точек и соединяют их, получая замкнутую фигуру. Python Programming, 2/e 47
Получение щелчков мыши n Если у вас есть три точки, то создать треугольник просто : triangle = Polygon(p 1, p 2, p 3) n Одиночный текстовый объект создаётся в начале программы. message = Text(Point(5, 0. 5), "Щелкните по трём точкам") message. draw(win) n Чтобы изменить подсказку, просто измените текст, который выведен. message. set. Text("Щелкните где-нибудь, чтобы выйти. ") Python Programming, 2/e 48
Обработка ввода текста n n Ввод в программе, рисующей треугольник, осуществляется исключительно с помощью щелчков мыши. Имеется также объект Entry, который может получать ввод с клавиатуры. Объект Entry рисует текстовое поле на экране. Объект понимает методы set. Text и get. Text, с одним дополнением: ввод можно редактировать. Python Programming, 2/e 49
Обработка ввода текста Python Programming, 2/e 50
Обработка ввода текста # convert_gui. pyw # Программа преобразования температуры по Цельсию в температуру по Фаренгейту # с использованием простого графического интерфейса from graphics import * def main(): win = Graph. Win("Преобразователь температуры ", 300, 200) win. set. Coords(0. 0, 3. 0, 4. 0) # Рисуем интерфейс Text(Point(1, 3), " Температура по Цельсию: "). draw(win) Text(Point(1, 1), " Температура по Фаренгейту : "). draw(win) input = Entry(Point(2, 3), 5) input. set. Text("0. 0") input. draw(win) output = Text(Point(2, 1), "") output. draw(win) button = Text(Point(1. 5, 2. 0), " Преобразуй") button. draw(win) Rectangle(Point(1, 1. 5), Point(2, 2. 5)). draw(win) Python Programming, 2/e 51
Обработка ввода текста # Ждём щелчок мыши win. get. Mouse() # Преобразуем ввод celsius = eval(input. get. Text()) fahrenheit = 9. 0/5. 0 * celsius + 32 # выводим на экран результат и меняем название кнопки output. set. Text(fahrenheit) button. set. Text("Выйти") # ждём щелчок и выходим win. get. Mouse() win. close() main() Python Programming, 2/e 52
Обработка ввода текста Python Programming, 2/e 53
Обработка ввода текста n В процессе работы программа создаёт окно с текстовым полем для ввода температуры по Цельсию и кнопку «Преобразуй» . n Кнопка бутафорская. В действительности мы ждём щелчок где угодно во всём окне. Python Programming, 2/e 54
Обработка ввода текста n n n Первоначально текстовое поле ввода содержит “ 0. 0”. Пользователь может стереть это значение и напечатать другое. Программа ждёт щелчка мыши – нам всё равно где, поэтому мы не запоминаем точку щелчка. Python Programming, 2/e 55
Обработка ввода текста n Ввод обрабатывается за три шага : n Введённое текстовое значение преобразуется в число функцией eval. n n Это число затем преобразуется а градусы Фаренгейта. Это число затем преобразуется в текст и форматируется для вывода в текстовое поле функции output. Python Programming, 2/e 56