Pack python tkinter атрибуты

# Метод pack()

Для позиционирования элементов в окне применяются различные способы, и самый простой способ представляет вызов у элемента метода pack() . Этот метод принимает следующие параметры:

  • expand (растянуть): если равно True , то виджет заполняет все пространство контейнера.
  • fill (заполнить): определяет, будет ли виджет растягиваться, чтобы заполнить свободное пространство вокруг. Этот параметр может принимать следующие значения: NONE (по умолчанию, элемент не растягивается), X (элемент растягивается только по горизонтали), Y (элемент растягивается только по вертикали) и BOTH (элемент растягивается по вертикали и горизонтали).
  • side (сторона): выравнивает виджет по одной из сторон контейнера. Может принимать значения: TOP (по умолчанию, выравнивается по верхней стороне контейнера), BOTTOM (выравнивание по нижней стороне), LEFT (выравнивание по левой стороне), RIGHT (выравнивание по правой стороне).
  • anchor (якорь): может принимать значения CENTER (центр), N ( north – север), S ( south – юг), W ( west – запад), E ( east – восток) и их комбинации: NW , NE , SW , SE .

Применение метода без параметров может быть таким:

from tkinter import * root = Tk() button = Button(root, text="Click me!") button.pack() root.mainloop() 

Необходимость реализации виджетов друг за другом с лева на право:

from tkinter import * root = Tk() button1 = Button(root, text="Button 1", fg="red", bg="yellow") button1.pack(side=LEFT) button2 = Button(root, text="Button 2", fg="orange", bg="green") button2.pack(side=LEFT) button3 = Button(root, text="Button 3", fg="white", bg="blue") button3.pack(side=LEFT) root.mainloop() 

Расположение элементов по разные стороны. Для лучшего понимания попробуйте растянуть окно и понаблюдать за положением виджетов:

from tkinter import * root = Tk() button1 = Button(root, text="Button 1", fg="red") button1.pack() button2 = Button(root, text="Button 2", fg="green") button2.pack(side=TOP) button3 = Button(root, text="Button 3", fg="black") button3.pack(side=LEFT) button4 = Button(root, text="Button 4", fg="purple") button4.pack(side=RIGHT) button5 = Button(root, text="Button 5", fg="blue") button5.pack(side=BOTTOM) root.mainloop() 

# Упражнения

  1. Создайте программу с тремя копками: 1, 2, 3. Расположите сверху вниз столбиком: 1, 2, 3 с привязкой к верхнему краю окна. Разверните окно на весь экран и проверьте корректность отображения.
  2. Создайте программу с тремя копками: 1, 2, 3. Расположите сверху вниз столбиком: 3, 2, 1 с привязкой к нижнему краю окна. Разверните окно на весь экран и проверьте корректность отображения.
  3. Создайте программу с тремя копками: 1, 2, 3. Расположите строчкой: 1, 2, 3 с привязкой к левому краю окна. Разверните окно на весь экран и проверьте корректность отображения.
  4. Создайте программу с тремя копками: 1, 2, 3. Расположите строчкой: 3, 2, 1 с привязкой к правому краю окна. Разверните окно на весь экран и проверьте корректность отображения.
Читайте также:  Php script document root

# Растягивание виждета

Комбинируя параметры side и fill , можно растянуть элемент по вертикали:

from tkinter import * root = Tk() button_1 = Button(root, text="One", bg="red", fg="white") button_1.pack() button_2 = Button(root, text="Two", bg="green", fg="black") button_2.pack(side=TOP, fill=X) button_3 = Button(root, text="Three", bg="blue", fg="yellow") button_3.pack(side=LEFT, fill=Y) button_4 = Button(root, text="Four", bg="purple", fg="lightblue") button_4.pack(side=RIGHT) button_5 = Button(root, text="Five", bg="blue", fg="pink") button_5.pack(side=BOTTOM) root.mainloop() 

Следующие два свойства – fill (заполнение) и expand (расширение). По-умолчанию expand равен нулю (другое значение – единица), а fill – NONE (другие значения BOTH , X , Y ). Создадим окно с одной меткой:

from tkinter import * root = Tk() label = Label(bg="lightgreen", width=30, height=10, text="This is a label") label.pack() root.mainloop() 

Если начать расширять окно или сразу раскрыть его на весь экран, то метка окажется вверху по вертикали и в середине по горизонтали. Причина, по которой метка не в середине по вертикали заключается в том, что side по-умолчанию равен TOP .

Если установить свойство expand в 1, то при расширении окна метка будет всегда в середине:

Свойство fill заставляет виджет заполнять все доступное пространство. Заполнить его можно во всех направлениях или только по одной из осей:

Последняя опция метода pack() – anchor (якорь) – может принимать значения N ( north – север), S ( south – юг), W ( west – запад), E ( east – восток) и их комбинации:

… label.pack(expand=1, anchor=SE) 

# Упражнения

  1. Создайте программу с двумя кнопками растягиваемые по горизонтали, прикрепленными к верхней и нижней границам окна.
  2. Создайте программу с двумя кнопками растягиваемые по вертикали, прикрепленными к левой и правой границам окна.
  3. Напишите программу с кнопкой растягивающейся на всё окно, независимо от размера окна.
  4. Создайте четыре программы с кнопкой, которая будет привязана к углу окна. И при увеличении размеров окна виджет продолжит оставаться в том же углу:
    • в левом верхнем углу окна;
    • в правом верхнем углу окна;
    • в левом нижнем углу окна;
    • в правом нижнем углу окна;
  5. Создайте одну программу с четырьмя кнопками по углам окна. И при увеличении размеров окна виджет продолжит оставаться в тех же углах:
    • в левом верхнем углу окна;
    • в правом верхнем углу окна;
    • в левом нижнем углу окна;
    • в правом нижнем углу окна;
  6. Создайте программу с центральным расположением метки с текстом «Центр». При увеличении размеров окна виджет продолжит оставаться по центру: по горизонтали и вертикали.
  7. Для дальнейшего переиспользования кода, создайте новый файл с названием app_rainbow.py . Напишите программу с заголовком «Colors» и меткой с текстом «Color name», размер шрифта для всех виджетов можно указать font=20 :
    • Добавьте в программу одно-строчное текстовое поле с текстом «Color code». Выровняйте текст по центру текстового поля, используя свойство justify=CENTER :
  • Добавьте в программу 7 кнопок, цвета которых соответствуют цветам радуги. Коды цветов в шестнадцатеричной кодировке:
    • #ff0000 – красный (red),
    • #ff7d00 – оранжевый (orange),
    • #ffff00 – желтый (yellow),
    • #00ff00 – зеленый (green),
    • #007dff – голубой (lightblue),
    • #0000ff – синий (blue),
    • #7d00ff – фиолетовый (purple).
    • Добавьте событие вызова функции при нажатия красной кнопки. Функция выводит в консоль текст: название red и код цвета #ff0000 .
    • Измените функцию так, чтобы при нажатии на кнопку, менялся текст и цвет текста ранее созданной метки на соответствующее название цвета нажатой кнопки.
    • доработайте функцию так, чтобы при нажатии на кнопку, менялся текст и фон, ранее созданного, текстового поля на соответствующий код цвета нажатой кнопки:
    • добавьте отдельные функции для каждой кнопки, которые будут выводить название и код нажатой кнопки.

    Источник

    Метод pack

    Прежде чем продолжить знакомство с виджетами GUI остановимся на вопросе их расположения в окне. Это важный вопрос, так как от продуманности интерфейса во многом зависит удобство использования программы. Организуя виджеты в пространстве, программист отчасти становится дизайнером, разработчиком интерфейсов.

    В Tkinter существует три так называемых менеджера геометрии – упаковщик, сетка и размещение по координатам. В этом уроке будет рассмотрен первый как наиболее простой и часто используемый, остальные два изучим позже.

    Упаковщик (packer) вызывается методом pack , который имеется у всех виджетов-объектов. Мы уже использовали его. Если к элементу интерфейса не применить какой-либо из менеджеров геометрии, то он не отобразится в окне. При этом в одном окне (или любом другом родительском виджете) нельзя комбинировать разные менеджеры. Если вы начали размещать элементы интерфейса методом pack , не пытайтесь тут же использовать методы grid (сетка) и place (место).

    Если в упаковщики не передавать аргументы, то виджеты будут располагаться вертикально, друг над другом. Тот объект, который первым вызовет pack , будет вверху. Который вторым – под первым, и так далее.

    У метода pack есть параметр side (сторона), который принимает одно из четырех значений-констант tkinter – TOP , BOTTOM , LEFT , RIGHT (верх, низ, лево, право). По умолчанию, когда в pack не указывается side , его значение равняется TOP . Из-за этого виджеты располагаются вертикально.

    Создадим четыре раскрашенные метки

    … l1 = Label(width=7, height=4, bg='yellow', text="1") l2 = Label(width=7, height=4, bg='orange', text="2") l3 = Label(width=7, height=4, bg='lightgreen', text="3") l4 = Label(width=7, height=4, bg='lightblue', text="4")

    и рассмотрим разные комбинации значений сайда:

    side=TOP side=BOTTOM side=LEFT side=RIGHT Разные значения опции side метода pack Разные значения опции side метода pack

    Проблема двух последних вариантов в том, что если надо разместить виджеты квадратом, т. е. два сверху, два снизу ровно под двумя верхними, то сделать это проблематично, если вообще возможно. Поэтому прибегают к вспомогательному виджету – фрейму (рамке), который порождается от класса Frame .

    Фреймы размещают на главном окне, а уже в фреймах – виджеты:

    from tkinter import * root = Tk() f_top = Frame(root) f_bot = Frame(root) l1 = Label(f_top, width=7, height=4, bg='yellow', text="1") l2 = Label(f_top, width=7, height=4, bg='orange', text="2") l3 = Label(f_bot, width=7, height=4, bg='lightgreen', text="3") l4 = Label(f_bot, width=7, height=4, bg='lightblue', text="4") f_top.pack() f_bot.pack() l1.pack(side=LEFT) l2.pack(side=LEFT) l3.pack(side=LEFT) l4.pack(side=LEFT) root.mainloop()

    Упаковка во фреймы

    Кроме Frame существует похожий класс LabelFrame – фрейм с подписью. В отличие от простого фрейма у него есть свойство text .

    … f_top = LabelFrame(text="Верх") f_bot = LabelFrame(text="Низ")

    Использование LabelFrame

    Кроме side у pack есть другие параметры-свойства. Можно задавать внутренние ( ipadx и ipady ) и внешние ( padx и pady ) отступы:

    Опции padx и pady Опции ipadx и ipady

    Когда устанавливаются внутренние отступы, то из-за того, что side прибивает виджет к левой границе, справа получаем отступ в 20 пикселей, а слева – ничего. Можно частично решить проблему, заменив внутренние отступы рамки на внешние отступы у меток.

    Установка отступов у метки

    Но тут появляется промежуток между самими метками. Чтобы его убрать, пришлось бы каждый виджет укладывать в свой собственный фрейм. Отсюда делаем вывод, что упаковщик Tkinter удобен только для относительно простых интерфейсов.

    Следующие два свойства – fill (заполнение) и expand (расширение). По-умолчанию expand равен нулю (другое значение – единица), а fill – NONE (другие значения BOTH , X , Y ). Создадим окно с одной меткой:

    from tkinter import * root = Tk() l1 = Label(text="This is a label", width=30, height=10, bg="lightgreen") l1.pack() root.mainloop()

    Если начать расширять окно или сразу раскрыть его на весь экран, то метка окажется вверху по вертикали и в середине по горизонтали. Причина, по которой метка не в середине по вертикали заключается в том, что side по-умолчанию равен TOP , и метку прибивает к верху.

    expand=0

    Если установить свойство expand в 1, то при расширении окна метка будет всегда в середине:

    expand=1

    Свойство fill заставляет виджет заполнять все доступное пространство. Заполнить его можно во всех направлениях или только по одной из осей:

    fill=Y

    Последняя опция метода pack – anchor (якорь) – может принимать значения N (north – север), S (south – юг), W (west – запад), E (east – восток) и их комбинации:

    Опция anchor метода pack

    Практическая работа

    Перепишите программу из практической работы предыдущего урока так, чтобы интерфейс выглядел примерно следующим образом:

    Пример интерфейса программы

    Курс с примерами решений практических работ: pdf-версия

    Tkinter. Программирование GUI на Python

    Источник

Оцените статью