JavaRush /Курси /Python SELF UA /Основи компонування елементів інтерфейсу (grid, pack)

Основи компонування елементів інтерфейсу (grid, pack)

Python SELF UA
Рівень 50 , Лекція 0
Відкрита

1. Методи компонування елементів у Tkinter

Як ти, можливо, вже помітив, графічні інтерфейси — це не просто кнопки і текстові поля, розкидані по екрану. Це добре структуровані та ергономічні додатки, де кожна деталь знає своє місце. Tkinter пропонує три основні методи компонування: pack, grid та place. Сьогодні ми зосередимося на pack і grid, залишивши place для більш складних композицій або ситуацій, коли потрібно розташувати елементи в абсолютних позиціях.

Знайомство з pack

Метод pack — це простий і інтуїтивний спосіб розміщення віджетів. Він компонує елементи за принципом "перший прийшов — перший обслуговується" і дозволяє швидко і безболісно організувати інтерфейс. Проте через свою простоту він не завжди забезпечує повний контроль над точним розташуванням елементів.

Приклад використання pack


import tkinter as tk

root = tk.Tk()
root.title("Приклад компонування з pack")

# Створюємо кілька віджетів
label = tk.Label(root, text="Я мітка")
button = tk.Button(root, text="Я кнопка")

# Розміщуємо віджети за допомогою pack
label.pack()
button.pack()

root.mainloop()

У цьому прикладі label і button просто розміщуються один під одним, як у дружній черзі за кавою. Мабуть, хлопці зі Starbucks знають, як це працює!

Знайомство з grid

Якщо pack — це веселий і хаотичний фестиваль, то grid — це класична бібліотека, де кожна книга (тобто віджет) має своє точне місце на полиці. Метод grid дозволяє розміщувати елементи у вигляді таблиці, надаючи можливість точного управління позиціонуванням. Тут вже ти сам вирішуєш, які елементи будуть стояти поруч з іншими.

Приклад використання grid


import tkinter as tk

root = tk.Tk()
root.title("Приклад компонування з grid")

# Створюємо кнопки
buttons = [
    "1", "2", "3",
    "4", "5", "6",
    "7", "8", "9",
    "0", "+", "="
]

# Додаємо кнопки в сітку
row_val = 0
col_val = 0

for button in buttons:
    btn = tk.Button(root, text=button, width=5)
    btn.grid(row=row_val, column=col_val)
    col_val += 1
    if col_val > 2:
        col_val = 0
        row_val += 1

root.mainloop()

У цьому прикладі кнопки grid вишикувались у шеренгу, як на ранковій перекличці, що виглядає більш організовано і професійно.

2. Використання pack для розміщення

У методу pack є кілька режимів, які дозволяють контролювати, як елементи вбудовуються відносно один одного. Він підтримує такі параметри, як side, fill, expand і padx/pady.

Налаштування pack

  • side: Визначає, з якого боку батьківського контейнера буде розміщений елемент. Це може бути TOP, BOTTOM, LEFT, або RIGHT.
  • fill: Чи заповнить елемент вільний простір уздовж осі. Наприклад, X заповнить по горизонталі, а Y — по вертикалі.
  • expand: Повідомляє менеджеру компонування, чи повинен елемент займати додаткове місце, якщо таке з'явиться.
  • padx/pady: Встановлює відступи по горизонталі і вертикалі.

Приклад розширеного використання pack


import tkinter as tk

root = tk.Tk()
root.title("Розширений приклад pack")

tk.Label(root, text="Зверху").pack(side=tk.TOP, fill=tk.X)
tk.Label(root, text="Знизу").pack(side=tk.BOTTOM, fill=tk.X)
tk.Label(root, text="Зліва").pack(side=tk.LEFT, fill=tk.Y)
tk.Label(root, text="Зправа").pack(side=tk.RIGHT, fill=tk.Y)

root.mainloop()

3. Використання grid для сіткового компонування

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

Налаштування grid

  • row / column: Визначає, у якому рядку чи стовпці буде розміщений елемент.
  • rowspan / columnspan: Визначає, скільки рядків чи стовпців займатиме елемент.
  • sticky: Визначає, як елемент буде "прилипати" до меж ячейки. Параметри можуть бути N, E, S, W та їх комбінації.

Приклад розширеного використання grid


import tkinter as tk

root = tk.Tk()
root.title("Розширений приклад grid")

# Створюємо мітки та розміщуємо їх у сітці
tk.Label(root, text="Ряд 0, Стовпець 0").grid(row=0, column=0, sticky="W")
tk.Label(root, text="Ряд 0, Стовпець 1").grid(row=0, column=1, sticky="E")
tk.Label(root, text="Ряд 1, Стовпець 0").grid(row=1, column=0, columnspan=2)

root.mainloop()

4. Практичне застосування та типові помилки

Може виникнути спокуса використовувати лише один метод компонування, але на практиці часто потрібно їх комбінування. Помилки, які часто виникають: забути викликати mainloop, неправильно вказати індекс рядка чи стовпця, не використовувати expand і fill, коли це потрібно. Щоб уникнути головного болю при розробці інтерфейсів, завжди перевіряй порядок виклику pack чи grid і забезпеч правильне використання їхніх параметрів.

Відмінність pack і grid у гнучкості та контролі над розташуванням елементів. pack зручний для простих вертикальних чи горизонтальних інтерфейсів, тоді як grid ідеально підходить для складних макетів, де важливі точні позиції елементів.

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

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ