Виджет Tkinter LabelFrame в Python на примерах

Содержание

Что такое Tkinter LabelFrame?

Виджет Tkinter LabelFrame в Python — это контейнер, содержащий другие связанные виджеты. Например, вы можете сгруппировать виджеты Radiobutton и поместить группу на LabelFrame.

Для создания виджета LabelFrame используйте ttk.LabelFrame:

lf = ttk.LabelFrame(container, **option)

В этом синтаксисе вы указываете родительский компонент(container) LabelFrame и одну или несколько опций. Примечательной опцией является text, который определяет метку для LabelFrame.

Пример виджета Tkinter LabelFrame

Следующая программа иллюстрирует, как создать виджет LabelFrame, который группирует три переключателя:

import tkinter as tk
from tkinter import ttk

# root window
root = tk.Tk()

# configure the root window
root.geometry('300x200')
root.resizable(False, False)
root.title('LabelFrame Demo')

# label frame
lf = ttk.LabelFrame(root, text='Alignment')
lf.grid(column=0, row=0, padx=20, pady=20)

alignment_var = tk.StringVar()
alignments =('Left', 'Center', 'Right')

# create radio buttons and place them on the label frame

grid_column = 0
for alignment in alignments:
    # create a radio button
    radio = ttk.Radiobutton(lf, text=alignment, value=alignment, variable=alignment_var)
    radio.grid(column=grid_column, row=0, ipadx=10, ipady=10)
    # grid column
    grid_column += 1

root.mainloop()

Выход:

Виджет Tkinter LabelFrame

Как это работает.

  • Сначала создайте виджет LabelFrame и используйте менеджер геометрии сетки для управления его компоновкой:
lf = ttk.LabelFrame(root, text='Alignment')
lf.grid(column=0, row=0, padx=20, pady=20)
  • Во-вторых, создайте три виджета-переключателя на основе списка выравниваний и поместите их в виджет рамки метки:
grid_column = 0

for alignment in alignments:
    # create a radio button
    radio = ttk.Radiobutton(lf, text=alignment, value=alignment, variable=alignment_var)
    radio.grid(column=grid_column, row=0, ipadx=10, ipady=10)
    # grid column
    grid_column += 1

Указание положения метки

Чтобы указать положение метки на виджете, используйте параметр labelanchor. Значение labelanchor по умолчанию равно ‘nw’, что помещает метку в левый конец верхней границы:

Пример использования параметра labelanchor

Следующая программа иллюстрирует параметры привязки метки. При выборе параметра метки метка виджета LabelFrame изменяется соответствующим образом:

Демонстрация привязки метки Tkinter LabelFrame

import tkinter as tk
from tkinter import ttk

# root window
root = tk.Tk()
root.title('LabelFrame Label Anchor')

# label frame
lf = ttk.LabelFrame(root, text='Label Anchor')
lf.grid(column=0, row=0, padx=20, pady=20, sticky=tk.NSEW)

anchor_var = tk.StringVar()
anchors = {
    'nw': {'row': 0, 'column': 1},
    'n': {'row': 0, 'column': 2},
    'ne': {'row': 0, 'column': 3},
    'en': {'row': 1, 'column': 4},
    'e': {'row': 2, 'column': 4},
    'es': {'row': 3, 'column': 4},
    'se': {'row': 4, 'column': 3},
    's': {'row': 4, 'column': 2},
    'sw': {'row': 4, 'column': 1},
    'ws': {'row': 3, 'column': 0},
    'w': {'row': 2, 'column': 0},
    'wn': {'row': 1, 'column': 0}
}


def change_label_anchor():
    lf['labelanchor'] = anchor_var.get()


# create radio buttons and place them on the label frame
for key, value in anchors.items():
    # create a radio button
    radio = ttk.Radiobutton(
        lf,
        text=key.upper(),
        value=key,
        command=change_label_anchor,
        variable=anchor_var
    ).grid(**value, padx=10, pady=10, sticky=tk.NSEW)

# set the radio button selected
anchor_var.set(lf['labelanchor'])

# show the root window
root.mainloop()

Как это работает.

  • Сначала создайте виджет LabelFrame и поместите его в корневое окно:
lf = ttk.LabelFrame(root, text='Label Anchor')
lf.grid(column=0, row=0, padx=20, pady=20, sticky=tk.NSEW)
  • Далее определите объект StringVar, который будет связан с переключателями:
anchor_var = tk.StringVar()
  • Затем определите словарь, в котором ключ хранит параметры метки, а значение хранит ячейку(строку, столбец) сетки:
anchors = {
    'nw': {'row': 0, 'column': 1},
    'n': {'row': 0, 'column': 2},
    'ne': {'row': 0, 'column': 3},
    'en': {'row': 1, 'column': 4},
    'e': {'row': 2, 'column': 4},
    'es': {'row': 3, 'column': 4},
    'se': {'row': 4, 'column': 3},
    's': {'row': 4, 'column': 2},
    'sw': {'row': 4, 'column': 1},
    'ws': {'row': 3, 'column': 0},
    'w': {'row': 2, 'column': 0},
    'wn': {'row': 1, 'column': 0}
}
  • После этого определите функцию, которая обрабатывает событие изменения переключателя. Функция изменяет опцию labelanchor виджета LabelFrame на значение выбранного переключателя:
def change_label_anchor():
    lf['labelanchor'] = anchor_var.get()

Наконец, создайте переключатель из словаря anchors и поместите его в виджет LabelFrame:

for key, value in anchors.items():
    # create a radio button
    radio = ttk.Radiobutton(
        lf,
        text=key.upper(),
        value=key,
        command=change_label_anchor,
        variable=anchor_var
    ).grid(**value, padx=10, pady=10, sticky=tk.NSEW)
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *