В этом руководстве вы узнаете о Tkinter Frame и о том, как в Python управлять его атрибутами, включая размеры, отступы и границы.
Что такое виджет Tkinter Frame?
Frame (рамка) — это виджет, который отображается как простой прямоугольник. Обычно рамка используется для организации других виджетов как визуально, так и на уровне кодирования.
Для создания фрейма используется класс ttk.Frame:
frame = ttk.Frame(master, **options)
Рамка имеет различные объекты конфигурации, которые определяют ее внешний вид.
| borderwidth | Указывает ширину границы рамки. По умолчанию она равна нулю. |
| class_ | Имя класса виджета. |
| cursor | Изменение внешнего вида курсора, когда курсор мыши находится над рамкой. |
| height | Высота рамки. |
| padding | Для создания отступов внутри рамки и снаружи содержащихся в ней виджетов. |
| relief | Укажите стиль рельефа для границы. Чтобы он был эффективен, вам также нужно задать ширину границы. |
| style | Название пользовательского стиля пользовательского виджета. |
| takefocus | Логическое значение указывает, посещается ли фрейм во время перемещения фокуса. По умолчанию это False. Таким образом, виджет фрейма не принимает фокус. |
| width | Установите ширину рамки. |
Размер рамки
Размер фрейма определяется размером и расположением виджетов, которые он содержит. Также вы можете явно указать высоту и ширину фрейма при его создании:
frame = ttk.Frame(master, height, width)
Отступ
Отступ позволяет добавлять дополнительное пространство внутри рамки и снаружи содержащихся виджетов. Отступы указываются в пикселях.
Чтобы указать отступы для каждой стороны рамки отдельно, используйте следующий синтаксис:
frame['padding'] =(left, top, right, bottom)
Например:
frame['padding'] =(5,10,5,10)
Или вы можете указать отступы слева, справа, сверху и снизу следующим образом:
frame['padding'] =(5, 10)
В этом примере отступы слева и справа равны 5, а сверху и снизу — 10. Если отступы со всех сторон одинаковы, вы можете указать отступ следующим образом:
frame['padding'] = 5
Границы рамок
По умолчанию ширина границы рамки равна нулю. Другими словами, рамка не имеет границы.
Чтобы задать границу рамки, необходимо задать ее ширину и стиль.
Ширина границы рамки указывается в пикселях. Стиль границы рамки может быть flat, groove, raised, ridge, solid или sunken. Стиль границы рамки по умолчанию — flat.
В следующем примере ширина границы рамки устанавливается равной 5 пикселям, а стиль границы рамки — sunken.
frame['borderwidth'] = 5 frame['relief'] = 'sunken'
На следующем рисунке показаны стили границ рамки:

Пример фрейма Tkinter
Мы собираемся создать следующее окно замены, которое довольно часто встречается в текстовых редакторах, таких как Блокнот:

Чтобы сделать виджеты более организованными, вы можете разделить окно на две рамки:
- Левый фрейм состоит из виджетов Label, Entry и Checkbox. Левый фрейм будет использовать менеджер геометрии сетки, который имеет два столбца и четыре строки.
- Правый фрейм состоит из виджетов Button. Правый фрейм также будет использовать менеджер геометрии сетки, который имеет четыре строки и один столбец.
Чтобы разместить левую и правую рамку в окне, можно использовать менеджер геометрии сетки, имеющий одну строку и два столбца:

Следующая программа иллюстрирует, как создать окно «Replace», показанное выше:
import tkinter as tk
from tkinter import TclError, ttk
def create_input_frame(container):
frame = ttk.Frame(container)
# grid layout for the input frame
frame.columnconfigure(0, weight=1)
frame.columnconfigure(0, weight=3)
# Find what
ttk.Label(frame, text="Find what:").grid(column=0, row=0, sticky=tk.W)
keyword = ttk.Entry(frame, width=30)
keyword.focus()
keyword.grid(column=1, row=0, sticky=tk.W)
# Replace with:
ttk.Label(frame, text="Replace with:").grid(column=0, row=1, sticky=tk.W)
replacement = ttk.Entry(frame, width=30)
replacement.grid(column=1, row=1, sticky=tk.W)
# Match Case checkbox
match_case = tk.StringVar()
match_case_check = ttk.Checkbutton(
frame,
text="Match case",
variable=match_case,
command=lambda: print(match_case.get()))
match_case_check.grid(column=0, row=2, sticky=tk.W)
# Wrap Around checkbox
wrap_around = tk.StringVar()
wrap_around_check = ttk.Checkbutton(
frame,
variable=wrap_around,
text="Wrap around",
command=lambda: print(wrap_around.get()))
wrap_around_check.grid(column=0, row=3, sticky=tk.W)
for widget in frame.winfo_children():
widget.grid(padx=5, pady=5)
return frame
def create_button_frame(container):
frame = ttk.Frame(container)
frame.columnconfigure(0, weight=1)
ttk.Button(frame, text="Find Next").grid(column=0, row=0)
ttk.Button(frame, text="Replace").grid(column=0, row=1)
ttk.Button(frame, text="Replace All").grid(column=0, row=2)
ttk.Button(frame, text="Cancel").grid(column=0, row=3)
for widget in frame.winfo_children():
widget.grid(padx=5, pady=5)
return frame
def create_main_window():
root = tk.Tk()
root.title('Replace')
root.resizable(0, 0)
try:
# windows only(remove the minimize/maximize button)
root.attributes('-toolwindow', True)
except TclError:
print('Not supported on your platform')
# layout on the root window
root.columnconfigure(0, weight=4)
root.columnconfigure(1, weight=1)
input_frame = create_input_frame(root)
input_frame.grid(column=0, row=0)
button_frame = create_button_frame(root)
button_frame.grid(column=1, row=0)
root.mainloop()
if __name__ == "__main__":
create_main_window()
Как это работает.
- Сначала импортируйте модуль tkinter и подмодуль tkinter.ttk:
import tkinter as tk from tkinter import ttk
- Во-вторых, создайте левый фрейм в функции create_input_frame(). Следующий код добавляет отступы ко всем виджетам в input_frame:
for widget in frame.winfo_children():
widget.grid(padx=0, pady=5)
- В-третьих, создайте нужную рамку в функции create_button_frame().
- В-четвертых, создайте корневое окно в функции create_main_window(). Следующий код удаляет кнопки минимизации/максимизации из окна:
root.attributes('-toolwindow', True)
Обратите внимание, что этот код работает только в Windows.
В функции create_main_window() мы также создаем левую и правую рамку и используем менеджер геометрии сетки для их размещения в корневом окне.
- Наконец, вызовите функцию create_main_window() в блоке if __name__ == «__main__»:.
