Тема 19(8):  Події. Вікна повідомлень. 

План вивчення теми:

Д/з: опрацювати:

Ми вже навчитися створювати статичні вікна та налаштовувати їх властивості. Але програми не будуються лише на статиці, їм властива і динаміка, тобто певні зміни. Тож розглянемо таке поняття як події. 

Одним із популярних підходів до вирішення проблеми програмування є створення об’єктів та подій для них. Такий підхід має назву об'єктно-орієнтоване  та подійно-орієнтоване програмування. Ця концепція у Python зосереджена на створенні та багаторазовому використанні фрагменту коду - підпрограми, для однотипних об'єктів. Ця концепція також відома як DRY (не повторюйся). Об’єктно- та подійно-орієнтоване програмування робить програму легкою для розуміння, компактною, а також ефективною.

Програмний об’єкт має дві характеристики:

Під час виконання проєкту з об'єктами можуть відбуватися події: 

Подія — це одна чи деяка послідовність дій, які відбуваються у наслідок реагування на іншу дію.

Обробник подій — це функція у вашій програмі, яка викликається, коли відбувається подія - метод.

Підпрограма - це окремо виділена частина проекту, яка має своє ім’я та яку можна за цим іменем запустити на виконання. У Python розрізняють підпрограми двох видів: процедури і функції.

Процедура - це підпрограма, результатом виконання якої є створення компонента (вікна, кнопки та ін.) або змінення значень властивостей існуючого, виведення певного тексту, створення зображення тощо. Зазвичай обробники подій є процедурами.

Функція - це підпрограма, результатом виконання якої є одне або кілька значень: числа, рядки тексту та ін.

Метод - це процедура або функція, що пов’язана з певним об’єктом - обробник події

Подія — це те , що відбувається з вашою програмою (наприклад, користувач натискає клавішу або клацає або перетягує мишу), на що програма має відреагувати.

Віджети зазвичай мають багато вбудованих функцій поведінки. Наприклад, кнопка реагує на клацання миші викликом commandзворотного виклику. Для іншого прикладу, якщо ви переміщуєте активізуєте віджет "поле введення" та на клавіатурі натискаєте клавішу з деякою літерою, то ця літера додається до вмісту віджета.

Однак можливість зв’язування подій Tkinter дозволяє додавати, змінювати або видаляти поведінку.

Процес реагування віджетів на певні події  називається зв’язуванням, коли програма встановлює обробник подій, який викликається, коли подія відбувається з віджетом.

З будь-якою подією, яка може відбутися з об'єктом, можна пов’язати фрагмент програми, який буде виконуватися одразу після настання цієї події. Такий фрагмент програми називають обробником події. Обробник події, пов’язаний з певним об’єктом, називають методом цього об’єкта. 

Методи

Дії, які можуть виконувати об'єкти або які можна виконувати над ними називають функціями або методами. Їх створюють за допомогою інструкції def  всередині тіла коду цілого класу однотипних об'єктів та належать цьому класу. 

Методи — це функції, які використовуються для визначення поведінки об’єкта. 

Над об'єктами можна виконувати певні дії, і ці дії здебільшого залежать якого характеру дані містяться в об'єкті, або ж, як ми вже з'ясували, до якого типу відноситься об'єкт. Над числами ми можемо виконувати одні дії, над символьними рядками інші, над кнопками вікна— ще інші.

Дії над об'єктами зручно виконувати за допомогою функцій передаючи їм об'єкти як аргумент. Але оскільки над об'єктами різних типів виконуються різні дії, то може виникнути ідея: як би зробити так, щоб у об'єктів певного типу були тільки свої функції?

Якщо ідея непогана, то треба її реалізовувати! І в Python ми зустрічаємо таке нове поняття, як "методи".

Метод — це по суті функція, яка "закріплена" за певним об'єктом і яка виконує певні дії над цим об'єктом.

Записується це наступним чином: об'єкт, далі ставиться крапка, і після крапки метод об'єкта:

object.method()

У наведеному вище прикладі "object" — це об'єкт, а "method" — його метод. Пам'ятаючи що метод — це функція, його можна викликати в середині тіла основної програми. Важливо щоб програмний код метод був описаний до команди виклику цього методу.


Позначення в мові Python деяких подій, які можуть відбутися з вікном:

Подія  (позначення в мові Python) Орієнтовне Ім'я_обробника події Опис роботи

<Button-1> або <1> Click - клацання лівої кнопки миші

<Double-Button-1> або <Double-1> DbICIick - подвійне клацання лівої кнопки миші 

<Motion> (англ. motion - рух) MouseMove - рух вказівника по вікну

<KeyPress> KeyPress - натискання будь-якої клавіші на клавіатурі 

<Expose> (англ. expose - розкривати) Create - створення вікна 

<FocusOut> (англ. focus out - вихід фокуса) Close - закривання вікна 

<Button-3> – клік правою клавішею миші по будь-якій області об’єкта;

<Destroy> – закриття вибраного вікна.

У мові Python обробник події для вікна створюють як окрему підпрограму та пов’язують її з вікном, використовуючи метод bind (англ. bind- в’язати, пов’язувати).

Загальний вигляд обробника події:

def <ім'я_обробника_події>(event): - рядок заголовку підпрограми

<команди, які будуть виконуватися під час настання події> - тіло підпрограми

Команда пов’язування обробника події з вікном:

ім'я_вікна.bind('<подія>',<ім'я_обробника_події>) - точка виклику підпрограми

Наприклад

def click (event):

root.bind(<'1>', click)

Команди обробника події потрібно записувати з відступом праворуч від лівої межі вікна редактора коду. Відступ утворюється автоматично, якщо після симво-ла «:» натиснути клавішу Enter, або його можна зробити самостійно, натиснувши один раз клавішу Tab.

Якщо потрібно, щоб у результаті настання події змінилися значення певних властивостей вікна, обробник події повинен містити команди змінення значень цих властивостей. Це можуть бути команди застосування до вікна деяких методів, наприклад geometry(), title(), або команда присвоювання. Загальний вигляд команди присвоювання такий:

Знак = називають знаком присвоювання.

Наприклад, виконання команди присвоювання root[‘bg’] = ‘green’ установить зелений колір вікна з іменем root. Застосувавши метод гооЬбЬе(‘Змінення значень властивостей вікна’), можна вивести вказаний у лапках текст у рядку заголовка вікна. А для того щоб розміри вікна стали 400 х 200 пікселів, відстань від лівої межі екрана - 500 пікселів, від верхньої - 70 пікселів, потрібно застосувати метод root.geometry(‘400x200+500+70’).

Обробник події записують перед його використанням, найчастіше на початку тексту проекту. Запис команд після обробника події повинен розпочинатися від лівої межі вікна. Для переміщення курсора в цю позицію потрібно використати клавішу Backspace. Так, після обробника події слід записати команди створення вікна та пов’язування з ним обробника події:

На малюнку 6.14 наведено приклад процедури click - обробника події Click для вікна, що складається з вищеописаних команд, під час виконання якої зміняться значення властивості bg, текст заголовка, розміри і положення вікна, і результат її виконання.

Іноді треба під час опрацювання події встановити нове значення властивості об’єкта, що обчислюється на основі поточного значення цієї самої властивості. Наприклад, потрібно, щоб після клацання лівої кнопки миші вікно опустилося на 50 пікселів, тобто слід збільшити відстань вікна від верхньої межі екрана на 50 пікселів. У такому разі треба отримати поточне значення відстані, змінити його на 50 і запам’ятати результат в окремій змінній, щоб установити нове положення вікна.

Для отримання поточних значень розмірів і положення вікна використовують такі методи вікна:

Наприклад, щоб дізнатися поточну відстань вікна з іменем root від верхньої межі екрана та збільшити її на 50, потрібно виконати команду:

t = root.winfo_y() + 50

Щоб установити нове значення, потрібно в рядок визначення положення та розмірів вікна методу geometry() замість числа підставити значення змінної. Для цього на місці, де потрібно вставити значення змінної, увести символи {} і до рядка застосувати метод підстановки format() з іменем змінної, відокремивши його крапкою:

root.geometry(‘300x200+500+{}’.format(t))

Якщо потрібно підставити в рядок значення кількох змінних, то на всіх відповідних місцях потрібно ввести символи {}, а у методі format() перерахувати імена змінних через кому.

Наприклад, для того щоб після настання події клацання лівої кнопки миші вікно опустилося на 50 пікселів униз, а його ширина збільшилася на 40 пікселів, можна виконати проект, наведений на малюнку 6.15.

Після запуску проекту на виконання потрібно дочекатися відкриття вікна і вибрати будь-яку його точку. Тим самим відбудеться подія Click для вікна та буде виконана процедура - обробник події, результатом виконання якої буде змінення положення та розмірів вікна.

Звертаємо вашу увагу, що в одному проекті можуть бути створені процедури опрацювання кількох різних подій з одним і тим самим або з різними об’єктами.

Приклад 1

при повторних кліканнях ЛКМ по вікну:

 t=root.winfo_y()+50 - команда визначає поточне положення вікна від верхньої межі екрану в пікселях та збільшує цю висоту ще на 50 пікселів; це числове значення присвоюється змінній t

 root.geometry('{}x320+320+200'.format(t,w)) - команда встановлює нові значення ширини вікна та відвтані зверху екрану до початку рамки цього вікна; метод format підставляє значення змінної t та w у вираз почерзі у відповідні фігурні дужки { }

Вікна повідомлень 

Для виведення на екран у ході виконання проєкту текстових повідомлень  можна використати спеціальне вікно - вікно повідомлень. У мові Pyton можна створити вікна повідомлень кількох видів.

Для відкриття вікна повідомлення із заданим текстом заголовка й виведення в ньому заданого тексту повідомлення потрібно імпортувати до проєкту модуль tkinter.messagebox і використати команду відповідно до призначення вікна.

- створення інформаційного  вікна з текстовим повідомленням.

- створення вікна попередження з текстом попередження і відповідним значком.

- створення вікна оповіщення про помилку з відповідним значком і повідомленням.

Посилання на On-line-середовищe Python https://repl.it

Завдання 1

Створити функцію, яка б змінювала розміри вікна window на 500х500 пікселів та встановлювала зелений колір фону.

Завдання 2

Додати до попередньої програми вікно з повідомленням. Заголовок вікна «Повідомлення», текст «Я програмую на Python»

Інший спосіб організації програмного коду для виведення вікна повідомлень:

Завдання 3

Створіть новий файл Python та нове вікно. Створіть подію KeyPress, яка встановить розміри вікна 400х500 пікселів, сірий колір фону і змінить текст заголовка вікна на клас, у якому ви навчаєтесь, встановіть мінімальні розміри 300х400 та максимальні 900х1000. Також створіть подію Button-1, яка буде створювати вікно повідомлення з заголовком Ваше прізвище та змістом “Я навчаюся у 8-А(Б,В,Г) класі!”.

Завдання 4

Створіть новий файл Python та нове вікно. Створіть подію Button-3, яка встановить розміри вікна 700х600 пікселів, фіолетовий колір фону і змінить текст заголовка вікна на назву вашої школи. Також встановіть заборону на змінення розмірів вікна та виведіть вікно повідомлення. 

Завдання 6

Виконати тестові завдання - 

Завдання 7

Створіть проект, що відкриватиме різні типи вікон повідомлень з використанням різних методів головного вікна програми.