Властивості та методи елементів керування.

Які елементи керування вже розглянуті?

Які пакувальники застосовувались?

Які об'єкти створювали? Які параметри цих об'єктів задавали?

Де і як прописується обробник події (що відбувається при натисканні на кнопку)?

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

Тому елемент керування умовно можна описати формулою:

Елемент керування = властивості (стан) + методи (дії) + події (зворотні зв’язки)

Виділяють такі три основні типи подій:

• взаємодія з мишею;

• натискання клавіш на клавіатурі;

• зміна стану об’єктів, створених у результаті виконання програми.

Приклади подій взаємодії з мишею:

• <Button-1> — клацання лівою кнопкою миші;

• <Button-2> — клацання середньою кнопкою миші;

• <Button-3> — клацання правою кнопкою миші;

• <Double-Button-1> — подвійне клацання лівою кнопкою миші;

• <Motion> — рух миші.

При описі події натискання клавіш клавіатури літерні клавіші можна записувати без кутових дужок (наприклад, ’L’). Для неалфавітних клавіш існують спеціальні зарезервовані слова:


• <Return> — натискання клавіші Enter;

• <Space> — пропуск;

• <Control> — натискання клавіші Ctrl;

• <Shift> — натискання клавіші Shift;

• <z> — натискання клавіші z.

В останньому випадку замість z можна використовувати будь-який символ клавіатури, що містить літеру. Назву події натисканні комбінації клавіш вказують через дефіс. Наприклад: <Control-a> або <Control-Shift>.

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

Зв’язувати об’єкт керування, подію та дію можна й за допомогою методу bind. У функцій-обробників, які викликають через bind, а не через властивість command, має обов’язково бути параметр event,

через який передається подія.

Тоді виклик цієї функції задається конструкцією:

Об’єкт bind('<подія>', назва_функції)

Завдання. Створити три кнопки , при натисканні на які буде змінюватися колір тла вікна відповідно зелений, жовтий, червоний.

Вгорі напис, на якому: Ви не обрали жодний колір. Зробіть вибір!

Після того, як колір обрали (колір), звісно колір зміниться і відповідно зміниться текст напису.


Прокоментувати відомий код, який будете використовувати 

from tkinter import*

root=Tk()

root.geometry("300x200")

root["bg"]="white"

root.resizable(0,0)


root.rowconfigure(0,minsize=100)

root.rowconfigure(1,minsize=100)

root.columnconfigure(0,minsize=120)

root.columnconfigure(1,minsize=120)

root.columnconfigure(2,minsize=120)

root.mainloop()

from tkinter import*

def green():

    root["bg"]="green"

    message["text"]="Ви обрали зелений колір"

    

def yellow():

    root["bg"]="yellow"

    message["text"]="Ви обрали жовтий колір"

    

def red():

    root["bg"]="red"

    message["text"]="Ви обрали червоний колір"

root=Tk()

root.geometry("300x200")

root["bg"]="white"

root.resizable(0,0)

message = Label(root, text="Ви не обрали колір", font="Arial 16", bg="white")

message.grid(row=0, column=0, columnspan=3)

but_green=Button(root, text="Зелений", font="Arial 16",                                    bg="green", command=green)

but_green.grid(row=1, column=0)

but_yellow=Button(root, text="Жовтий", font="Arial 16",                                bg="yellow", command=yellow)

but_yellow.grid(row=1, column=1)

but_red=Button(root, text="Червоний", font="Arial 16",                                  bg="red", command=red)

but_red.grid(row=1, column=2)

root.rowconfigure(0,minsize=100)

root.rowconfigure(1,minsize=100)

root.columnconfigure(0,minsize=120)

root.columnconfigure(1,minsize=120)

root.columnconfigure(2,minsize=120)

root.mainloop()

Створити напис Ви не обрали колір і розпакували(розмістили) його у першому рядку, першому стовпцю - об'єднавши три стовпця)

Створити три кнопки

btn_green

btn_yellow

btn_red

ці кнопки розміщені в одному вікні (root, text="підписані відповідним кольором",bg="колір тла відповідна назва",command=прив'язка до відповідної функції)

Розміщені всі три кнопки у другому рядку, але кожна кнопка в окремому стовпцю.

До прив'язок green yellow red з параметру command 

створити три функції (обробники подій) 

def green():    def yellow():  def red():

Функції кажуть змінити колір вікна на відповідний

root["bg"]="green"    root["bg"]="yellow"

root["bg"]="red"

І текст напису на відповідний дії

message["text"]="Ви обрали зелений колір"

message["text"]="Ви обрали жовтий колір"

message["text"]="Ви обрали червоний колір"

Самостійне завдання 1. Змінити код, щоб при натисканні також змінювався ще на відповідний колір напису 

from tkinter import*

def green():

    root["bg"]="green"

    message["text"]="Ви обрали зелений колір"

    

def yellow():

    root["bg"]="yellow"

    message["text"]="Ви обрали жовтий колір"

    

def red():

    root["bg"]="red"

    message["text"]="Ви обрали червоний колір"

    

root=Tk()

root.geometry("360x200")

root["bg"]="white"

root.resizable(0,0)

message = Label(root, text="Ви не обрали колір", font="Arial 16", bg="white")

message.grid(row=0, column=0, columnspan=3)

but_green=Button(root, text="Зелений", font="Arial 16", bg="green", command=green)

but_green.grid(row=1, column=0)

but_yellow=Button(root, text="Жовтий", font="Arial 16", bg="yellow", command=yellow)

but_yellow.grid(row=1, column=1)

but_red=Button(root, text="Червоний", font="Arial 16", bg="red", command=red)

but_red.grid(row=1, column=2)

root.rowconfigure(0,minsize=100)

root.rowconfigure(1,minsize=100)

root.columnconfigure(0,minsize=120)

root.columnconfigure(1,minsize=120)

root.columnconfigure(2,minsize=120)

root.mainloop()


Як повернути все до першочергового стану?

Події можуть бути різні. Це не тільки натискання клавіші мишки по області об'єкта, як це відбувається при використанні параметра command.

Це може бути: натискання клавіші на клавіатурі, наведення на об'єкт або на його частину тощо.

Параметр command. для прив'язки події до кнопки використовується рідко.

1) Бо це працює тільки з кнопками.

2) І працює тільки ліва клавіша миші.

Загалом, щоб під'єднати до будь-якого об'єкта деяку подію, використовують метод

.bind

from tkinter import*

def green(event):

    root["bg"]="green"

    message["text"]="Ви обрали зелений колір"

    

def yellow(event):

    root["bg"]="yellow"

    message["text"]="Ви обрали жовтий колір"

    

def red(event):

    root["bg"]="red"

    message["text"]="Ви обрали червоний колір"


def cancel(event):


root=Tk()

root.geometry("360x200")

root["bg"]="white"

root.resizable(0,0)

message = Label(root, text="Ви не обрали колір", font="Arial 16", bg="white")

message.grid(row=0, column=0, columnspan=3)

but_green=Button(root, text="Green", font="Arial 16", bg="green")

but_green.bind("<Button-1>",green)

but_green.grid(row=1, column=0)

but_yellow=Button(root, text="Жовтий", font="Arial 16", bg="yellow")

but_yellow.bind("<Button-3>",yellow)

but_yellow.grid(row=1, column=1)

but_red=Button(root, text="Червоний", font="Arial 16", bg="red")

but_red.bind("<Motion>",red)

but_red.grid(row=1, column=2)

root.bind("<Return>",cancel)

root.rowconfigure(0,minsize=100)

root.rowconfigure(1,minsize=100)

root.columnconfigure(0,minsize=120)

root.columnconfigure(1,minsize=120)

root.columnconfigure(2,minsize=120)

root.mainloop()

Щоб використати метод .bind

-вказують об'єкт до якого застосовано метод

but_green.bind("<Button-1>",green)

у параметрах виводять два параметра:

перший - подія, яка виконується "<Button-1>" це натискання лівої кнопки миші

другий - функція, яка буде виконуватися, коли буде виконана ця подія (натискання ЛКМ) green

АНАЛОГІЧНО

but_yellow.bind("<Button-3>",yellow)

"<Button-3>" це натискання правої  кнопки миші

 but_red.bind("<Motion>",red)

"<Motion>" це наведення миші

ОДНОЧАСНО

 відбуваються певні налаштування в оголошенні функції, з'являється аргумент event

який каже, що підв'язали цю функцію до події

def green(event):

def yellow(event):

def red(event):

Застосуємо подію до вікна

root.bind("<Return>",cancel)

Подія - натискання клавіші enter  виконується функція cancel повернення вікна до першочергового стану

Самостійне завдання 2. Створити функцію cancel повернення вікна до першочергового стану, яка буде відміняти дії попередніх натискань, при натисканні на клавішу enter

from tkinter import*

def green(event):

    root["bg"]="green"

    message["text"]="Ви обрали зелений колір"


def yellow(event):

    root["bg"]="yellow"

    message["text"]="Ви обрали жовтий колір"

  

def red(event):

    root["bg"]="red"

    message["text"]="Ви обрали червоний колір"


def cancel(event):


    


root=Tk()

root.geometry("360x200")

root["bg"]="white"

root.resizable(0,0)

message = Label(root, text="Ви не обрали колір", font="Arial 16", bg="white")

message.grid(row=0, column=0, columnspan=3)

but_green=Button(root, text="Green", font="Arial 16", bg="green")

but_green.bind("<Button-1>",green)

but_green.grid(row=1, column=0)

but_yellow=Button(root, text="Жовтий", font="Arial 16", bg="yellow")

but_yellow.bind("<Button-3>",yellow)

but_yellow.grid(row=1, column=1)

but_red=Button(root, text="Червоний", font="Arial 16", bg="red")

but_red.bind("<Motion>",red)

but_red.grid(row=1, column=2)

root.bind("<Return>",cancel)

root.rowconfigure(0,minsize=100)

root.rowconfigure(1,minsize=100)

root.columnconfigure(0,minsize=120)

root.columnconfigure(1,minsize=120)

root.columnconfigure(2,minsize=120)

root.mainloop()