Віджети
Ключовим будівельним блоком у графічному додатку є різні елементи управління, з якими взаємодіє користувач, як кнопки, мітки, поля введення. Tkinter має багату палітру різних елементів управління, які називаються віджетами . Основні з них:
- Button: кнопка
- Label : текстова мітка
- Entry: однорядкове текстове поле
- Text : багаторядкове текстове поле
- Checkbutton : прапорець
- Radiobutton: перемикач або радіокнопка
- Frame : кадр, який організовує віджети в групи
- Listbox: список
- Combobox: список, що випадає
- Menu: елемент меню
- Scrollbar : смуга прокручування
- Treeview : дозволяє створювати деревоподібні та табличні елементи
- Scale : текстова мітка
- Spinbox: список значень зі стрілками для переміщення елементами
- Progressbar: текстова мітка
- Canvas : текстова мітка
- Notebook: панель вкладок
Tkinter надає віджети у двох варіантах: віджети, які знаходяться безпосередньо в пакеті tkinter , і віджети з пакету tkinter.ttk . З одного боку, обидва пакети надають практично ті самі віджети, наприклад, віджет Button є в обох пакетах. Але з іншого боку, ttk надає трохи більше функціональності з налаштування віджетів, зокрема, з їхньої стилізації. І вважається, що віджети з ttk дещо сучасніші, ніж стандартні, в той же час з ttk, можливо, трохи складніше працювати. Що використовувати залишається на вибір розробника.
Розглянемо різницю на прикладі віджету Button. Спочатку подивимося на стандартний віджет Button із загального пакету tkinter:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("250x200") btn = Button(text="Click") # створюємо кнопку з пакету tkinter btn.pack() # розміщуємо кнопку у вікні root.mainloop()
Тепер подивимося на прикладі кнопки з пакету ttk:
from tkinter import * from tkinter import ttk # підключаємо пакет ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") btn = ttk.Button(text="Click") # створюємо кнопку з пакету ttk btn.pack() # розміщуємо кнопку у вікні root.mainloop()
По суті ми створюємо ту ж кнопку з тим же написом, проте її зовнішній вигляд буде дещо інший:
Надалі я буду орієнтуватися насамперед на віджети з пакету ttk, але перейти на стандартні віджети не складе особливих труднощів.
Параметри віджету
Віджет має набір параметрів, які дозволяють налаштувати його зовнішній вигляд і поведінку. Кожен віджет має свій набір параметрів. Зазвичай параметри задаються через конструктор. Наприклад, у прикладі вище кнопки встановлювався параметр text , який задає текст на кнопці:
ttk.Button(text="Click") # встановлюємо параметр text
Але звертатися до параметрів можна і поза конструктором, використовуючи ім'я змінної віджету та синтаксис словників:
з tkinter import * від tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x150") btn = ttk.Button() btn.pack() # встановлюємо параметр text btn[" text"]="Send" # отримуємо значення параметра text btnText = btn["text"] print(btnText) root.mainloop()
Для зміни параметрів віджету також можна використовувати метод config() , який передаються параметри та їх значення:
btn = ttk.Button() btn.pack() # встановлюємо параметр text btn.config(text="Send Email")
Отримання інформації про віджет
Для отримання інформації про віджет можна використовувати низку його атрибутів. Розглянемо деякі з них:
- winfo_class : повертає клас віджету, наприклад, для кнопки це клас TButton
- winfo_children : повертає для поточного віджету список вкладених віджетів
- winfo_parent : повертає батьківський віджет
- winfo_toplevel : повертає вікно, яке містить цей віджет
- winfo_width та winfo_height : поточна ширина та висота віджету
- winfo_reqwidth і winfo_reqheight: запрошена віджетом ширина та висота
- winfo_x та winfo_y : x та y координати верхнього лівого кута віджета щодо батьківського елемента
- winfo_rootx та winfo_rooty : x та y координати верхнього лівого кута віджету щодо екрану
- winfo_viewable : вказує, чи відображається віджет або прихований
Наприклад, отримаємо інформацію про всі віджети у вікні:
від tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("250x200") btn = Button(text="Hello") btn.pack() def print_info(widget, depth=0 ): widget_class=widget.winfo_class() widget_width = widget.winfo_width() widget_height = widget.winfo_height() widget_x = widget.winfo_x() widget_y = widget.winfo_y() print(" "*depth + f" width= height= x= y=") for chi winfo_children(): print_info(child, depth+1) root.update() # оновлюємо інформацію про віджети print_info(root) root.mainloop()
Тут визначено функцію print_info() , яка як параметри отримує віджет, інформацію про який треба вивести на консоль, і рівень візуальної ієрархії елементів (depth).
У самій функції для віджету виводимо інформацію про клас, ширину, висоту та координати Х і Y, а також для кожного вкладеного віджету рекурсивно викликаємо цю ж функцію.
Щоб встановлені розміри та позиції були застосовані до віджетів до виклику root.mainloop() , викликаємо метод root.update()
В даному випадку візуальна ієрархія віджетів не така глибока – всього два елементи – вікно (Tk) та кнопка (Button), відповідно консольний висновок буде наступним:
Tk width=250 height=200 x=104 y=104 Button width=39 height=26 x=105 y=0
Що таке мітки та як їх використовувати?
Мітка – це слово чи фраза, що описує тему питання. Мітки допомагають залучити експертів до питань, а також дозволяють відповідати на останні шляхом їхнього сортування на певні та чіткі категорії.
Мітки також використовуються, щоб допомогти визначити питання, які вас цікавлять або належать до вашої спеціальності.
Натискання на мітку під питанням відкриває сторінку з усіма питаннями цієї мітки. Також з'явиться опис мітки та її контекст у рамках Stack Overflow російською (іноді ім'я мітки – це загальновживане слово, що має широке значення в реальному світі, але дуже вузьке і особливе значення на цьому сайті). Ці описи складають опис міток, який може бути змінено спільнотою, як будь-яке інше повідомлення.
Загалом, по можливості, рекомендується уникати створення нових міток, а нові користувачі не можуть створювати нові мітки. Навіть якщо ви маєте достатню репутацію, не варто створювати нову мітку, якщо ви не впевнені, що ваше питання стосується нової теми, яку до цього ніхто не порушував на цьому сайті.
Кожне питання може містити не більше 5 міток, тому вибирайте ті, що найкраще описують ваше запитання. У мітках не допускаються прогалини – складові мітки створюються за допомогою дефісів, а не пробілів (наприклад, [visual-studio]). Не використовуйте багато позначок, розділених пробілом ( [visual] [studio] ).
###Як форматувати мітки
• Використовуються лише малі літери.
• Для поєднання кількох слів в одну фразу використовуються дефіси (-) (напр., мітка "unit testing" виглядатиме як unit-testing).
• Уникайте використання розділових знаків (це може утруднити використання мітки в URL).
• Під час створення назви мітки подумайте про те, як інші шукатимуть цю тему. Найчастіше це означає написання назви повністю, але іноді можна використовувати скорочення. Наприклад, [css] підійде краще, ніж [cascading-style-sheets].
При редагуванні користувачі можуть пропонувати виправлення або безпосередньо редагувати мітки питання, якщо вони припускають, що якась мітка була використана неправильно або що в питанні немає мітки.
Зміна мітки виконується, якщо:
• Таким чином, ви додаєте цінну інформацію до питання.
• Ви замінюєте незрозумілі або незрозумілі мітки відомими та популярними мітками, які підходять до питання.
###Уникайте використання мета-міток
Не використовуйте мета-мітки у питаннях. Ось кілька способів визначити, що мітка є мета-міткою:
• Якщо мітка не може бути єдиною міткою у питанні, можливо, вона є мета-міткою. Всі мітки, які ви використовуєте, повинні працювати в цілому, якщо вони є єдиною міткою в питанні. Мета-мітки, такі як [початківець] , [суб'єктивне] та [кращі-практики] , самі по собі марні – вони не повідомляють про зміст питання.
• Якщо мітка може означати різні речі для різних людей, можливо вона є мета-міткою. Наприклад, значення мітки [суб'єктивне] саме собою суб'єктивне, як і і міток [кращі-практики] і [початківець] . Найкращі практики для кого? Який починає за якими мірками? Використовуйте лише позначки із загальноприйнятим та об'єктивним визначенням.
###Чи використовувати мітки в заголовках?
Не варто штучно вставляти мітку у заголовок.Так як мітки знаходяться прямо під питанням і пошукові машини індексують мітки разом із вмістом вашого питання, повірте, інші зможуть знайти ваше питання по мітках, за якими вони стежать або які вони шукають. враховувати їх при відповіді на ваше запитання.
Уникайте використання міток у назвах у будь-якому з наступних форматів:
• [мітка]: [назва питання];
• [назва питання] - [мітка] [мітка] [мітка];
• [назва питання] у [мітка];
• [мітка] [мітка] [назва питання] [мітка] [мітка] [мітка];
• [мітка] [мітка] [мітка] [мітка] [мітка] [мітка] [мітка] [мітка].
Єдиний випадок, коли варто використовувати мітку в заголовку, коли вона органічно вписується в розмовний стиль заголовка.
Наприклад, замість назви "JavaScript, jQuery: коли використовувати перше, а коли друге?", в якому штучно використовуються мітки в тексті, можна повідомити ту саму інформацію в розмовному стилі:
Чи можна використовувати jQuery для метазмінних чи доведеться обмежитися чистим JavaScript?