Виджет 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. Правый фрейм также будет использовать менеджер геометрии сетки, который имеет четыре строки и один столбец.

Чтобы разместить левую и правую рамку в окне, можно использовать менеджер геометрии сетки, имеющий одну строку и два столбца:

Сетка фрейма Tkinter

Следующая программа иллюстрирует, как создать окно «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__»:.
Похожие посты
Добавить комментарий

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