Виджет Tkinter Frame (рамка) в Python — основное руководство
В этом руководстве вы узнаете о 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__»:.