Виджет Tkinter Frame в Python – размещение в окне
Виджет Python Tkinter Frame используется для организации группы виджетов. Он действует как контейнер, который можно использовать для хранения других виджетов. Прямоугольные области экрана используются для организации виджетов в приложении Python.
Синтаксис для использования виджета Frame приведен ниже.
Список возможных вариантов приведен ниже.
№ | Вариант | Описание |
---|---|---|
1 | bd | Он представляет ширину границы. |
2 | bg | Цвет фона виджета. |
3 | cursor | Указатель мыши изменяется на тип курсора, для которого заданы другие значения, такие как стрелка, точка и т. д. |
4 | height | Высота виджета. |
5 | highlightbackground | Цвет фона, когда он находится в фокусе. |
6 | highlightcolor | Цвет текста, когда виджет находится в фокусе. |
7 | highlightthickness | Он определяет толщину вокруг границы, когда виджет находится в фокусе. |
8 | relief | Он определяет тип границы. Значение по умолчанию FLAT. |
9 | width | Он представляет ширину виджета. |
Пример
from tkinter import * top = Tk() top.geometry("140x100") frame = Frame(top) frame.pack() leftframe = Frame(top) leftframe.pack(side = LEFT) rightframe = Frame(top) rightframe.pack(side = RIGHT) btn1 = Button(frame, text="Submit", fg="red",activebackground = "red") btn1.pack(side = LEFT) btn2 = Button(frame, text="Remove", fg="brown", activebackground = "brown") btn2.pack(side = RIGHT) btn3 = Button(rightframe, text="Add", fg="blue", activebackground = "blue") btn3.pack(side = LEFT) btn4 = Button(leftframe, text="Modify", fg="black", activebackground = "white") btn4.pack(side = RIGHT) top.mainloop()
# Frame() — рамка
Для сложных интерфейсов используют отдельные области позиционирования элементов.
Фрейм — вспомогательный виджет, создание которого происходит при помощи класса Frame() .
Фреймы размещают на главном окне, а уже в фреймах – виджеты:
from tkinter import * root = Tk() frame_top = Frame(root) # root можно не указывать frame_top.pack() label_1 = Label(frame_top, width=7, height=4, bg='yellow', text="1") label_1.pack(side=LEFT) label_2 = Label(frame_top, width=7, height=4, bg='orange', text="2") label_2.pack(side=LEFT) frame_bottom = Frame(root) frame_bottom.pack() label_3 = Label(frame_bottom, width=7, height=4, bg='lightgreen', text="3") label_3.pack(side=LEFT) label_4 = Label(frame_bottom, width=7, height=4, bg='lightblue', text="4") label_4.pack(side=LEFT) root.mainloop()
Кроме Frame существует похожий класс LabelFrame – фрейм с подписью. В отличие от простого фрейма у него есть свойство text:
from tkinter import * root = Tk() frame_top = LabelFrame(text="Верх") frame_top.pack() label_1 = Label(frame_top, width=7, height=4, bg='yellow', text="1") label_1.pack(side=LEFT) label_2 = Label(frame_top, width=7, height=4, bg='orange', text="2") label_2.pack(side=LEFT) frame_bottom = LabelFrame(text="Низ") frame_bottom.pack() label_3 = Label(frame_bottom, width=7, height=4, bg='lightgreen', text="3") label_3.pack(side=LEFT) label_4 = Label(frame_bottom, width=7, height=4, bg='lightblue', text="4") label_4.pack(side=LEFT) root.mainloop()
# Упражнения
- Допишите существующий код, добавив ниже фрэйм «Footer», в котором будут горизонтально находиться две метки с надписями «5», «6».
- Допишите существующий код, добавив на верх фрэйм «Header», в котором будут горизонтально находиться три кнопки с надписями «File», «View», «About». Реализуйте растяжение кнопок по ширине окна.
- Напишите программу с четырьмя кнопками, которые будут расположены в углах окна, и при изменении размера окна.
# Горизонтальное расположение
Как и для обычных виджетов, задавая параметры .pack() можно изменять положения фреймов. внеся изменения в наш код, мы получим левостороннее расположение фреймов:
frame_top.pack(side=LEFT) frame_bottom.pack(side=LEFT)
Кроме side у pack() есть другие параметры-свойства. Можно задавать внутренние ( ipadx и ipady ) и внешние ( padx и pady ) отступы:
frame_top.pack(padx=100, pady=50) frame_bottom.pack(ipadx=10, ipady=10)
В результате верхний фрейм отступает от всех ближайших элементов на заданное расстояние, область отступа обведена красной рамкой. В нижнем фрейме появились отступы элементов от рамки:
Когда устанавливаются внутренние отступы, то из-за того, что side прибивает виджет к левой границе, справа получаем отступ в 20 пикселей, а слева – ничего. Можно частично решить проблему, заменив внутренние отступы рамки на внешние отступы у меток. Изменим код следующим образом:
frame_bottom.pack() label_3.pack(side=LEFT, padx=10, pady=10) label_4.pack(side=LEFT, padx=10, pady=10)
Но тут появляется промежуток между метками. Чтобы его убрать, пришлось бы каждый виджет укладывать в свой собственный фрейм. Отсюда делаем вывод, что упаковщик tkinter удобен только для относительно простых интерфейсов.
# Упражнения
from tkinter import * import time def tick(): # get the current local time from the PC time2 = time.strftime('%H:%M:%S') # if time string has changed, update it clock.config(text=time2) # calls itself every 200 milliseconds to update the time # display as needed could use >200 ms clock.after(200, tick) root = Tk() clock = Label(root, font=('times', 20, 'bold'), bg='green') clock.pack(fill=BOTH, expand=1) tick() root.mainloop()
- Напишите программу с часами состоящую из трех рамок:
- рамка «Moscow time» выводит текущее время в виде: «Moscow time: 17:27:37»,
- рамка «Current time» выводит текущее время в виде: «Hour: 17 Minutes: 27 Second: 37»
- рамка «Left time until the new day» выводит сколько часов минут и секунд осталось до нового дня.
- одно-строчного текстового поля,
- метки с отображением знака «+»,
- второго одно-строчного текстового поля,
- кнопкой «=», при нажатии на которую результат вычисления выводиться в третье текстовое поле,
- третьего одно-строчного тестового поля.
- реализуйте растяжение виджетов по ширине в зависимости от ширины окна.
- Добавьте проверку деления на 0. С выводом сообщения об ошибке, в удобное для пользователя место. Консольный вывод сообщения об ошибке исключить.
Python 3 — Tkinter Frame
The Frame widget is very important for the process of grouping and organizing other widgets in a somehow friendly way. It works like a container, which is responsible for arranging the position of other widgets.
It uses rectangular areas in the screen to organize the layout and to provide padding of these widgets. A frame can also be used as a foundation class to implement complex widgets.
Syntax
Here is the simple syntax to create this widget −
Parameters
- master − This represents the parent window.
- options − Here is the list of most commonly used options for this widget. These options can be used as key-value pairs separated by commas.
The normal background color displayed behind the label and indicator.
The size of the border around the indicator. Default is 2 pixels.
If you set this option to a cursor name (arrow, dot etc.), the mouse cursor will change to that pattern when it is over the checkbutton.
The vertical dimension of the new frame.
Color of the focus highlight when the frame does not have focus.
Color shown in the focus highlight when the frame has the focus.
Thickness of the focus highlight.
With the default value, relief = FLAT, the checkbutton does not stand out from its background. You may set this option to any of the other styles
The default width of a checkbutton is determined by the size of the displayed image or text. You can set this option to a number of characters and the checkbutton will always have room for that many characters.
Example
Try the following example yourself −
# !/usr/bin/python3 from tkinter import * root = Tk() frame = Frame(root) frame.pack() bottomframe = Frame(root) bottomframe.pack( side = BOTTOM ) redbutton = Button(frame, text = "Red", fg = "red") redbutton.pack( side = LEFT) greenbutton = Button(frame, text = "Brown", fg="brown") greenbutton.pack( side = LEFT ) bluebutton = Button(frame, text = "Blue", fg = "blue") bluebutton.pack( side = LEFT ) blackbutton = Button(bottomframe, text = "Black", fg = "black") blackbutton.pack( side = BOTTOM) root.mainloop()
Result
When the above code is executed, it produces the following result −