Checkbutton
Елемент Checkbutton є прапорцем, який може перебувати в двох станах: зазначеному і невідзначеному.
Конструктор Checkbutton приймає ряд параметрів, відзначимо основні з них:
command : посилання на функцію, що викликається при натисканні на прапорець
cursor : курсор при наведенні на елемент
image : графічне зображення, яке відображається на елементі
offvalue : значення прапорця в невідзначеному стані, за умовчанням 0
onvalue : значення прапорця у зазначеному стані за замовчуванням дорівнює 1
padding : відступи від тексту до межі прапорця
state : стан елемента може приймати значення NORMAL (за замовчуванням), DISABLED та ACTIVE
text : текст елементу
textvariable : прив'язаний до тексту об'єкт StringVar
underline : індекс підкресленого символу у тексті прапорця
variable : Посилання на змінну, як правило, типу IntVar, яка зберігає стан прапорця
width : ширина елемента
Створимо найпростіший прапорець:

Відмінністю Checkbutton є можливість прив'язки до змінної через параметр variable , який представляє значення прапорця. Тут цей параметр прив'язаний до змінної enabled типу IntVar. У зазначеному стані прив'язаний об'єкт IntVar має значення 1, а невідзначеному - 0. У результаті через IntVar ми можемо отримувати значення, вказане користувачем.

Обробка зміни прапорця
За допомогою параметра command можна встановити функцію, яка буде викликатись при зміні стану прапорця:

Тут за зміни стану прапорця спрацьовує функція checkbutton_changed. У ній в залежності від стану прапорця (а точніше в залежності від значення змінної enabled) за допомогою вбудованої функції showinfo()відображаємо повідомлення про стан прапорця:

onvalue та offvalue
Параметри onvalue та offvalue дозволяють задати значення прапорця у зазначеному та невідзначеному стані. За умовчанням вони дорівнюють 1 і 0 відповідно. Однак ми можемо передати їм інші, більш зручні для нас значення.

Текст прапорця
Для встановлення тексту прапорця можна використовувати параметри textта textvariable. Причому ми можемо прив'язати текст прапорця до його значення за допомогою textvariable:

В даному випадку для зберігання тексту у зазначеному та невідзначеному станах визначено дві змінні: enabledon та enabledoff. Змінна enabled ініціалізується тим самим значенням (enabled_on), що й параметр onvalue, тому за замовчуванням прапорець буде позначено. А оскільки його параметри textvariable і variable прив'язані до однієї і тієї ж змінної enabled, то вони змінюватимуться синхронно

Обробка кількох прапорців
Аналогічно можна використовувати набори прапорців:


Radiobutton
Віджет Radiobutton представляє перемикач, який може перебувати у двох станах: зазначеному чи невідзначеному. Але на відміну від Checkbutton перемикачі можуть створювати групу, з якої миттєво ми можемо вибрати тільки один перемикач.
Серед параметрів конструктора Radiobutton варто виділити такі:
command : посилання на функцію, що викликається при натисканні на перемикач
cursor : курсор при наведенні на віджет
image : графічне зображення, що відображається віджетом
padding : відступи від вмісту до межі перемикача
state : стан віджету, може приймати значення NORMAL (за замовчуванням), DISABLED та ACTIVE
text : текст віджету
textvariable : встановлює прив'язку до змінної StringVar, яка задає текст перемикача
underline : індекс підкресленого символу у тексті віджету
variable : посилання змінну, зазвичай, типу IntVar, що зберігає стан перемикача
value : значення перемикача
width : ширина віджету
Визначимо групу перемикачів:

Тут визначено три перемикачі. Всі вони прив'язані до однієї змінної lang, яка представляє тип StringVar. При цьому вони мають різні значення, що встановлюються за параметром value . Початкове значення змінної lang ("java") відповідає значенню value останнього перемикача, тому за замовчуванням буде обраний останній перемикач.
Для виведення виділеного значення над перемикачами визначено текстову мітку, яка відображає значення змінної lang:

У прикладі вище відображуваний текст (параметр text) і значення (параметр value) збігаються, але це необов'язково
Обробка вибору користувача
Параметр command дозволяє встановити функцію, яка обробляє вибір перемикача. Наприклад:

Тут для спрощення дані перемикачів визначено у вигляді списку languages. У циклі for пробігаємось по всіх елементах списку та створюємо перемикач. При натисканні на кожен перемикач спрацьовуватиме функція select(), яка встановить для мітки header відповідний текст:

Встановлення зображення
Для встановлення зображення застосовується параметр image :

Параметру image передається об'єкт PhotoImage, у конструкторі якого через параметр fileвстановлюється шлях зображення. Тут передбачається, що в одній папці з файлом програми знаходяться файли зображень "python_sm.png", "csharp_sm.png" та "java_sm.png".

Якщо потрібно також відображати і текст, то для цього можна встановити параметр compound , який визначає положення тексту по відношенню до зображення за допомогою одного з наступних значень:
top : зображення поверх тексту
bottom : зображення під текстом
left : зображення зліва від тексту
right : зображення праворуч від тексту
none : за наявності зображення відображається лише зображення
text : відображається лише текст
image : відображається лише зображення
Наприклад, відобразимо картинку поверх тексту:


Встановлення батьківського контейнера. Frame
Кожен віджет, крім вікна, розміщується у певному батьківському контейнері. Наприклад:

Тут для мітки lbl контейнером виступає головне вікно – root. Однак графічний додаток може мати складнішу структуру з безліччю вкладених контейнерів. І для кожного віджету можна явно встановити контейнер за допомогою першого параметра конструктора, який називається master . Наприклад, у прикладі вище ми могли б явно прописати для Label батьківський контейнер:

В даному випадку це немає сенсу, кнопка за замовчуванням додається у вікно. Однак ми можемо визначати вкладені контейнери. Зокрема, для Tkinter призначений віджет Frame .
Frame
Frame відображає прямокутник і зазвичай застосовується для організації інтерфейсу окремі блоки. Деякі основні параметри, які ми можемо встановити через конструктор класу Frame:
borderwidth : товщина межі кадру, за умовчанням дорівнює 0
relief : визначає тип кордону, може приймати значення SUNKEN, RAISED, GROOVE, RIDGE
cursor : встановлює курсор при наведенні на кадр
height : висота кадру
width : ширина кадру
padding : відступи від вкладеного вмісту до меж кадру
Використовуємо фрейми:

Тут фрейм має межу завтовшки один піксель. Кордон представляє звичайну лінію ( relief=SOLID). Також для кадру задані внутрішні відступи: 8 по горизонталі та 10 по вертикалі. Для встановлення відступів можна використовувати такі форми:

При цьому ми можемо винести за створення кадру:

Тут для створення кадру визначено функцію create_frame, яка повертає кадр з позначкою та текстовим полем. Далі створюємо за допомогою цієї функції два фрейми і додаємо їх у вікно:

Listbox
Віджет Listbox tkinter представляє список об'єктів. Варто відзначити, що цей віджет присутній тільки в пакеті tkinter, а в пакеті tkinter.ttk для нього немає аналогів.
Для налаштування Listbox ми можемо вказати у його конструкторі такі параметри:
listvariable : список елементів, які додаються до ListBox
bg : фоновий колір
bd : товщина межі навколо елемента
cursor : курсор при наведенні на Listbox
font : налаштування шрифту
fg : колір тексту
highlightcolor : колір елемента, коли він отримує фокус
highlightthickness : товщина межі елемента, коли він знаходиться у фокусі
relief : встановлює стиль елемента, що за замовчуванням має значення SUNKEN
selectbackground : колір фону для виділеного елемента
selectmode : визначає, скільки елементів може бути виділено. Може приймати такі значення: BROWSE, SINGLE, MULTIPLE, EXTENDED. Наприклад, якщо необхідно включити множинне виділення елементів, можна використовувати значення MULTIPLE чи EXTENDED.
height : Висота елемента в рядках. За промовчанням відображає 10 рядків
width : встановлює ширину елемента символів. За замовчуванням ширина – 20 символів
xscrollcommand : задає горизонтальне прокручування
yscrollcommand : встановлює вертикальне прокручування
Визначимо простий список:

Для наповнення listboxa елементами визначаємо список мов, потім цей список передаємо в змінну типу Variable. Потім прив'язуємо цю змінну до параметра listvariableListbox

Основні методи Listbox
Listbox має ряд методів для керування поведінкою елемента та його вмістом. Деякі з них:
curselection() : повертає набір індексів виділених елементів
delete(first, last = None) : видаляє елементи з індексами з діапазону [first, last]. Якщо другий параметр опущений, видаляє лише один елемент за індексом first.
get(first, last = None) : повертає кортеж, який містить текст елементів із індексами з дипазону [first, last]. Якщо другий параметр опущено, повертається лише текст елемента із індексом first.
insert(index, element) : вставляє елемент за певним індексом
size() : повертає кількість елементів
Для розгляду цих методів напишемо невеликий скрипт з управління даними:

Для маніпулювання елемента списку тут визначено дві кнопки. Перша кнопка викликає функцію add(), яка отримує введене в текстове поле значення та додає його на перше місце у списку за допомогою методу insert() .
Друга кнопка натискання видаляє виділений елемент. Для цього ми спочатку отримуємо виділені індекси через метод curselection() . Так як у нашому випадку виділяється лише один елемент, то отримуємо його індекс через вираз selection[0]. І цей індекс передаємо метод delete() для видалення.

Подібним чином ми можемо керувати елементами, якщо Listbox прив'язаний до змінної типу Var/StringVar:

Для спрощення тут я прибрав код для видалення, тому що суть буде такою самою. А саме: у нас є стандартний список рядків languages та є змінна languagesvar, яка використовує цей список і до якої прив'язаний Listbox. Всі операції з елементами всередині Listbox, наприклад, додавання за допомогою дзвінка languageslistbox.insert(0, newlanguage)вплинуть на змінну languagesvar– вона змінить своє значення. Але! Початковий список рядків languages залишиться без змін.
Що, якщо нам також потрібно змінити сам початковий список languages, особливо коли у нас в програмі кілька функціональних частин, які використовують цей список і які мають бути синхронізовані? У цьому випадку ми можемо додавати та видаляти елементи безпосередньо у списку languages, але тоді необхідно встановлювати заново значення змінної languages_var, до якої прив'язаний Listbox:

Режим та обробка вибору
За промовчанням Listbox дозволяє вибрати один елемент. Але за допомогою параметра selectmode цю поведінку можна перевизначити. Цей параметр приймає одне з наступних значень:
BROWSE: дозволяє вибирати один елемент та перетягувати його мишкою. Режим за промовчанням.
EXTENDED: дозволяє вибрати групу елементів, виділивши початковий та кінцевий елементи.
SINGLE: дозволяє вибрати один елемент, але не дозволяє перетягувати його мишкою
MULTIPLE: дозволяє вибрати велику кількість елементів, надимаючи на рядок елемента.
Наприклад, встановлення вибору кількох елементів:

Наприклад, динамічно обробимо вибір у списку:

У цьому випадку при зміні вибору списку спрацьовує функція selected. Функція повинна приймати один параметр, який несе інформацію про подію - це параметр event. Хоча в цьому випадку він не використовується.
У самій функції спочатку отримуємо індекси виділених елементів за допомогою методу curselection(), потім у циклі отримуємо власне елементи цих індексів і створюємо загальний рядок, яка потім виводиться в елементі Label.

Програмне виділення
Ряд методів Listbox дозволяють програмно керувати виділенням елементів:
select_set(first, last) : виділяє з індексу first індекс last. Якщо треба виділити лише один елемент, то застосовується лише параметр first
select_includes(index) : повертає True, серед елемента з індексом index виділено
select_clear(first, last) : знімає виділення з індексу first індекс last. Якщо треба зняти виділення лише з одного елемента, то застосовується лише параметр first
Наприклад, виділимо елементи з 1 по 2 індекси:

