Что такое 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()
Выход:

Как это работает.
- Сначала создайте виджет 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’, что помещает метку в левый конец верхней границы:

Следующая программа иллюстрирует параметры привязки метки. При выборе параметра метки метка виджета 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) 