Разработка графического интерфейса Python с помощью Tkinter на примерах

Создание первого окна

Как упоминалось выше, Tkinter доступен со стандартными установками Python, поэтому независимо от вашей операционной системы создание вашего первого окна должно быть очень быстрым. Все, что вам нужно, это 3 строки кода:

импорт tkinter root = tkinter.Tk () root.mainloop()

Производство:

Создание первого окна

После импорта пакета tkinter в строке 1, в строке 3 мы создаем виджет для главного окна (корня) приложения. Чтобы программа работала должным образом, в нашем интерфейсе должен быть только один корневой виджет, и, поскольку все остальные виджеты будут располагаться дальше по иерархии, чем корневые, он должен быть создан перед любыми другими виджетами.

В строке 5 мы инициализируем основной корневой цикл. Эта строка сохраняет окно в цикле, который ожидает событий (например, взаимодействия с пользователем) и соответствующим образом обновляет интерфейс. Цикл заканчивается, когда пользователь закрывает окно или вызывается метод quit().

Добавление простых виджетов в корневое окно

В приведенном ниже примере мы рассмотрим общую двухэтапную систему создания виджетов, которую можно применить ко всем виджетам, кроме окон. Первый шаг — создать экземпляр определенного класса виджета.

На втором этапе нам нужно использовать один из доступных методов для размещения нового виджета внутри другого существующего (родительского) виджета. Самый простой виджет, который вы можете вставить в интерфейс Tkinter, — это метка, которая отображает только текст. В следующем примере создается простой виджет метки:

import tkinter root = tkinter.Tk () simple_label = tkinter.Label (root, text = «Легко, верно?») simple_label.pack () root.mainloop()

Производство:

Добавление простых виджетов в главное окно

Мы создаем экземпляр класса Label в строке 5 приведенного выше кода. В первом аргументе мы указываем желаемый виджет родительской метки, которым в этом примере является наше главное окно. Во втором аргументе мы указываем текст, который должна отображать метка.

Итак, в строке 7 мы применяем метод ориентации нашей метки внутри главного окна. Самый простой метод ориентирования виджетов, предлагаемый Tkinter, — это pack (). Метка — единственный виджет внутри окна, поэтому он появляется только в центре окна.

Мы узнаем больше о том, как это работает, в следующем примере, когда мы добавим в окно еще один виджет. Обратите внимание, что размер окна автоматически регулируется в соответствии с размещенным внутри виджетом.

Ввод данных с помощью класса Entry (текстовое поле Tkinter)

В предыдущих примерах графического интерфейса Python мы видели, как добавлять простые виджеты. Теперь попробуем получить данные от пользователя с помощью класса Tkinter Entry (текстовое поле Tkinter).

Вы можете создать текстовое поле с помощью класса Tkinter Entry следующим образом:

Позже вы можете добавить виджет в окно, используя функцию сетки, как и раньше.

Наш код будет выглядеть так::

from tkinter import * def clicked (): lbl.configure (text = «Кнопка нажата !!») window = Tk () window.title («Добро пожаловать!») window.geometry (‘350×200’) lbl = Label (window, text = «Привет!») lbl.grid (column = 0, row = 0) txt = Entry (window, width = 10) txt.grid (column = 1, row = 0) btn = Button (window, text = » Щелкните меня «, command = clicked) btn.grid (column = 2, row = 0) window.mainloop () Язык кода: JavaScript (javascript)

Результат будет следующий:

Теперь, если вы нажмете на кнопку, отобразится то же сообщение, что и выше. Как насчет отображения текста, который вы ввели в виджете ввода?

Мы можем получить введенный текст с помощью функции get. Затем мы можем добавить его к нашей нажатой функции, например:

def clicked (): res = «Добро пожаловать» + txt.get () lbl.configure (text = res) Язык кода: JavaScript (javascript)

Если вы нажмете кнопку и в виджете ввода есть текст, отобразится «Добро пожаловать», соединенное с введенным вами текстом.

Вот полный код:

from tkinter import * def clicked (): res = «Welcome» + txt.get () lbl.configure (text = res) window = Tk () window.title («Добро пожаловать!») window.geometry (‘350×200’) lbl = Label (window, text = «Hello!») Lbl.grid (column = 0, row = 0) txt = Item (window, width = 10) txt.grid (column = 1, row = 0) btn = Button (window, text = «Click me», command = clicked) btn.grid (column = 2, row = 0) window.mainloop () Язык кода: JavaScript (javascript)

Запустите приведенный выше код и проверьте результат:

Потрясающе!

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

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

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

from tkinter import * root = Tk () button_1 = Button (root, text = «One», bg = «red», fg = «white») button_1.pack () button_2 = Button (root, text = «Два», bg = «зеленый», fg = «черный») button_2.pack (side = TOP, fill = X) button_3 = Button (root, text = «Three», bg = «blue», fg = «yellow») button_3 pack (side = LEFT, padding = 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 () 1
2
3
4
5
6
7
восемь
девять
10
одиннадцать
12
13
14

Результат исполнения:

Следующие два свойства — это заливка и расширение. По умолчанию расширение равно нулю (другое значение равно единице), а заполнение — НЕТ (другие значения — ОБА, X, Y). Создадим окно с меткой:

from tkinter import * root = Tk () label = Label (bg = «light green», width = 30, height = 10, text = «This is a label») label.pack () root.mainloop () 1
2
3
4
5

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

Если вы установите для свойства expand значение 1, когда окно расширяется, метка всегда будет в центре:

… Label.pack (expand = 1)… 1
2
3

Результат исполнения:

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

… Label.pack (expand = 1, fill = Y)… 1
2
3

Результат исполнения:

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

… Label.pack (expand = 1, снова = IF)… 1
2
3

Добавление функциональной кнопки

Теперь давайте добавим то, с чем может взаимодействовать пользователь. Очевидный выбор — простая кнопка. Давайте поместим кнопку в наше окно, что даст нам еще один способ закрыть наше окно.

import tkinter root = tkinter.Tk () root.title («Здравствуйте!») simple_label = tkinter.Label (root, text = «Легко, верно?») close_button = tkinter.Button (root, text = «Закрыть окно», command = root.destroy) simple_label.pack () close_button.pack () root.mainloop()

Производство:

Добавление функциональной кнопки

В строке 8 мы создаем экземпляр класса Button так же, как и метку. Однако, как вы, вероятно, видите, мы добавили аргумент команды, в котором мы сообщаем программе, что должно произойти после нажатия кнопки. В этом случае вызывается метод root destroy (), который закрывает наше окно во время выполнения.

В строках 10 и 11 мы снова используем метод pack (). На этот раз мы можем понять это немного лучше, поскольку теперь мы используем его для размещения двух виджетов внутри окна. В зависимости от порядка, в котором мы упаковываем наши виджеты, метод просто помещает их друг на друга в центре по горизонтали. Высота и ширина окна адаптированы к размеру виджетов.

Вы, наверное, заметили еще одну новую строчку. В строке 5 мы указываем заголовок корневого окна. К сожалению, самый широкий виджет в нашем интерфейсе недостаточно велик, чтобы сделать видимой строку заголовка.

Tkinter grid Метод раскладки

gridTkinter — еще один и самый важный метод геометрии компоновки. Этот метод следует изучить, если вы хотите изучить только один метод из всех менеджеров геометрии.

сетка часто используется в диалоговых окнах, и виджеты могут быть расположены на основе координат положения сетки. Метод компоновки сетки может иметь стабильные относительные позиции для всех виджетов.

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

Tkinter Geometry_Grid_Basic.py импортирует tkinter как tk app = tk.Tk () labelWidth = tk.Label (app, text = «Width Ratio») labelWidth.grid (column = 0, row = 0, ipadx = 5, pady = 5, sticky = tk.W + tk.N) labelHeight = tk.Label (app, text = «Height Ratio») labelHeight.grid (column = 0, row = 1, ipadx = 5, pady = 5, sticky = tk.W + tk.S) entryWidth = tk.Entry (app, width = 20) entryHeight = tk.Entry (app, width = 20) entryWidth.grid (column = 1, row = 0, padx = 10, pady = 5, sticky = tk.N) entryHeight.grid (column = 1, row = 1, padx = 10, pady = 5, sticky = tk.S) resultButton = tk.Button (app, text = ‘Получить результат’) resultButton.grid (column = 0, row = 2, pady = 10, sticky = tk.W) logo = tk.PhotoImage (file = ‘python.gif’) labelLogo = tk.Label (app, image = logo) labelLogo.grid (row = 0, column = 2, columnspan = 2, rowspan = 2, sticky = tk.W + tk.E + tk.N + tk.S, padx = 5, pady = 5) app.mainloop()

Tkinter grid column и row опции

labelWidth.grid (столбец = 0, строка = 0, ipadx = 5, pady = 5, sticky = tk.W + tk.N)

Каждый виджет должен быть помещен в абсолютную ячейку с использованием метода компоновки сетки. Координаты ячеек указываются столбцом и строкой.

Виджет labelWidth помещается в ячейку позиции (0, 0). Координата начинается в верхнем левом углу окна.

Параметры ipadx, ipady, padx и pady такие же, как и в методе упаковки.

Опция Tkinter grid sticky

sticky определяет, как виджет прикрепляется к ячейке, когда виджет меньше ячейки.

stickyValue

W держитесь левой стороны
А ТАКЖЕ держи правую руку
Нет оставаться на вершине
С подожди

Постоянный вариант по умолчанию — центральный, т.е. W + E + N + S.

Опции Tkinter columnspan и rowspan

labelLogo.grid (row = 0, column = 2, columnspan = 2, rowspan = 2, sticky = tk.W + tk.E + tk.N + tk.S, padx = 5, pady = 5)

Координата ячейки labelLogo равна (column = 2, row = 0), а размер логотипа относительно велик, поэтому он относительно размера ячейки 2×2 columnspan = 2, а rowspan = 2 означает, что виджет имеет два разворота ячеек по X и Y направления, начиная с позиции виджета.

Получение ввода с использованием класса Entry (текстовое поле Tkinter)

В предыдущих примерах графического интерфейса Python мы видели, как добавлять простые виджеты, теперь давайте попробуем получить ввод пользователя с помощью класса Tkinter Entry (текстовое поле Tkinter).
Вы можете создать текстовое поле с помощью класса Tkinter Entry следующим образом:

txt = entry (окно, ширина = 10)

Затем вы можете добавить его в окно, используя функцию сетки.
Наше окно будет выглядеть так:

from tkinter import * defclicked (): lbl.configure (text = «Я спросил…») window = Tk () window.title («Добро пожаловать в приложение PythonRu») window.geometry (‘400×250’) lbl = Label (window, text = «Hello») lbl.grid (column = 0, row = 0) txt = Voice (window, width = 10) txt.grid (column = 1, row = 0) btn = Button (window, text = «Не щелкайте!», Command = щелкните) btn.grid (column = 2, row = 0) window.mainloop()

Результат будет таким:

Учебник по графическому интерфейсу Python (учебник по Tkinter)
Теперь, если вы нажмете кнопку, отобразится то же старое сообщение, но как насчет отображения текста, введенного в виджете Entry?

Во-первых, вы можете получить вводимый текст с помощью функции get. Мы можем написать код для выбранной функции так:

defclicked (): res = «Hello {}» format (txt.get ()) lbl.configure (text = res)

Если вы нажмете кнопку, текст «Привет» появится вместе с текстом, введенным в виджет публикации. Вот полный код:

from tkinter import * defclicked (): res = «Hello {}» format (txt.get ()) lbl.configure (text = res) window = Tk () window.title («Добро пожаловать в приложение PythonRu») геометрия окна (‘400×250’) lbl = Label (window, text = «Hello») lbl.grid (column = 0, row = 0) txt = Item (window, width = 10) txt.grid (column = 1, row = 0) btn = Button (window, text = «Click!», Command = click) btn.grid (column = 2, row = 0) window.mainloop()

Запустите приведенный выше код и проверьте результат:

Учебник по графическому интерфейсу Python (учебник по Tkinter)
В совершенстве!

Всякий раз, когда мы запускаем код, мы должны щелкнуть виджет ввода, чтобы установить фокус на ввод текста, но как насчет автофокуса?

Установка фокуса виджета ввода

Здесь все очень просто, потому что все, что нам нужно сделать, это вызвать функцию фокуса:

txt.focus()

Когда вы запустите свой код, вы заметите, что виджет ввода имеет фокус, что позволяет сразу же писать текст.

Отключить виджет ввода

Чтобы отключить виджет ввода, отключите свойство состояния:

txt = Entry (окно, ширина = 10, состояние = ‘отключено’)

Учебник по графическому интерфейсу Python (учебник по Tkinter)
Теперь вы не сможете вводить какой-либо текст.

Настройка размеров окна приложения

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

window.geometry (‘400×250’)

Строка выше устанавливает размер окна до 400 пикселей в ширину и 250 пикселей в высоту.

Давайте попробуем добавить больше виджетов GUI, таких как кнопки, и посмотрим, как обрабатываются нажатия кнопок.

Добавление виджета Button

Начнем с добавления кнопки в окно. Кнопка создается и добавляется в окно так же, как и метка:

btn = Button (window, text = «Не нажимайте!») btn.grid (column = 1, row = 0)

Наш код будет выглядеть так:

from tkinter import * window = Tk () window.title («Добро пожаловать в приложение PythonRu») window.geometry (‘400×250’) lbl = Label (window, text = «Hello», font = («Arial Bold», 50)) lbl.grid (column = 0, row = 0) btn = Button (window, text = «Не нажимайте!») btn.grid (column = 1, row = 0) window.mainloop()

Результат будет следующий:

Учебник по графическому интерфейсу Python (учебник по Tkinter)
Обратите внимание, что мы помещаем кнопку во второй столбец окна, который равен 1. Если вы забудете и поместите кнопку в тот же столбец, который равен 0, будет отображаться только кнопка.

Изменение цвета текста и фона у Button

Вы можете изменить цвет текста кнопки или любого другого виджета, используя свойство fg.
Кроме того, вы можете изменить цвет фона любого виджета с помощью свойства bg.

btn = Button (window, text = «Не нажимать!», bg = «black», fg = «red»)

Учебник по графическому интерфейсу Python (учебник по Tkinter)
Теперь, если вы попытаетесь нажать кнопку, ничего не произойдет, потому что событие нажатия кнопки еще не было записано.

Кнопка Click

Сначала напишем функцию, которая должна выполняться при нажатии кнопки:

defclicked (): lbl.configure (text = «Я спросил…»)

Затем мы свяжем его с кнопкой, указав следующую функцию:

btn = Button (window, text = «Не нажимать!», command = click)

Обратите внимание, что мы пишем clicked, а не clicked () в круглых скобках. Полный код теперь будет выглядеть так:

from tkinter import * defclicked (): lbl.configure (text = «Я спросил…») window = Tk () window.title («Добро пожаловать в приложение PythonRu») window.geometry (‘400×250’) lbl = Label (window, text = «Hello», font = («Arial Bold», 50)) lbl.grid (column = 0, row = 0) btn = Button (window, text = «Не нажимать!», Command = нажал) btn.grid (столбец = 1, строка = 0) window.mainloop()

При нажатии на кнопку результат, как и ожидалось, будет выглядеть так:

Учебник по графическому интерфейсу Python (учебник по Tkinter)
Фреддо!

Установка размера шрифта метки

Вы можете изменить шрифт метки, чтобы сделать его больше или, возможно, жирным. Вы также можете изменить стиль шрифта.

Для этого передайте дополнительный символ параметра:

lbl = Label (window, text = «Hello!», font = («Arial Bold», 50)) Язык кода: JavaScript (javascript)

Следует отметить, что параметр шрифта может быть передан любому виджету для изменения его шрифта, а не только меток.

все прекрасно. Но окно настолько маленькое, что мы даже не видим заголовок. Как установить размер окна?

Управление размером окна

Давайте взглянем на три новые строки, которые позволят нам легко изменять размер нашего окна.

import tkinter root = tkinter.Tk () root.title («Здравствуйте!») root.resizable (width = «false», height = «false») root.minsize (width = 300, height = 50) root.maxsize (width = 300, height = 50) simple_label = tkinter.Label (root, text = «Easy, right?») close_button = tkinter.Button (root, text = «Close window», command = root.destroy) simple_label.pack () close_button.pack () root.mainloop()

Производство:

Разработка графического интерфейса с помощью Tkinter на Python

В строке 7 мы определяем, должен ли пользователь программы изменять ширину и высоту окна. В этом случае для обоих аргументов установлено значение «false», поэтому размер окна зависит только от нашего кода. Если бы не строки 9 и 10, это зависело бы от размера ориентированных виджетов внутри окна.

Однако в этом примере мы используем корневые методы minsize и maxsize для управления максимальными и минимальными значениями ширины и высоты нашего окна. Здесь мы точно определяем, насколько широким и высоким должно быть окно, но я рекомендую поиграть с этими тремя строками, чтобы увидеть, как работает масштабирование в зависимости от размера наших виджетов и какие минимальные и максимальные значения мы определяем.

Изменение цвета фона и шрифта кнопки.

Вы можете изменить цвет текста кнопки или любого другого виджета, используя свойство fg.

Также, используя свойство bg, вы можете изменить цвет фона любого виджета.

btn = Button (window, text = «Click me», bg = «orange», fg = «red») Язык кода: JavaScript (javascript)

Теперь, если вы попытаетесь нажать кнопку, ничего не произойдет, потому что событие нажатия кнопки еще не установлено.

Создание виджета Label

Чтобы добавить текст в наш предыдущий пример, мы создадим lbl, используя класс Label, например:

lbl = Метка (окно, текст = «Привет»)

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

lbl.grid (столбец = 0, строка = 0)

Полный код будет выглядеть так:

from tkinter import * window = Tk () window.title («Добро пожаловать в приложение PythonRu») lbl = Label (window, text = «Hello») lbl.grid (column = 0, line = 0) window.mainloop()

А вот как будет выглядеть результат:

Учебник по графическому интерфейсу Python (учебник по Tkinter)
Если функция сетки не вызывается, текст отображаться не будет.

Настройка размера и шрифта текста

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

lbl = Label (window, text = «Hello», font = («Arial Bold», 50))

Учебник по графическому интерфейсу Python (учебник по Tkinter)
Обратите внимание, что параметр шрифта можно передать любому виджету, чтобы изменить его шрифт, он применяется не только к метке.

Отлично, но стандартное окно маловато. Как насчет настройки размера окна?

Метод Tkinter place Метод

Метод Tkinter place помещает виджет в абсолютную или относительную позицию в окне. Мы по-прежнему используем тот же подход, что и выше, чтобы представить параметры этого метода компоновки.

Tkinter Geometry_Place_Basic.py импортирует tkinter как tk app = tk.Tk () app.geometry (‘300×300’) labelA = tk.Label (app, text = «Label (0, 0)», fg = «blue», bg = «# FF0») labelB = tk.Label (app, text = «Label (20, 20)», fg = «green», bg = «# 300») labelC = tk.Label (app, text = «Label (40, 50) «, fg =» black «, bg =» # f03 «) labelD = tk.Label (app, text =» Label (0.5, 0.5) «, fg =» orange «, bg =» # 0ff «) labelA.place (x = 0, y = 0) labelB.place (x = 20, y = 20) labelC.place (x = 40, y = 50) labelD.place (relx = 0.5, count = 0, 5)) приложение .mainloop()

Tkinter place Абсолютная позиция

labelA.place (x = 0, y = 0) labelB.place (x = 20, y = 20)

Параметры x = и y = in place определяют абсолютные позиции виджета в пиксельных единицах. Например, labelB.place (x = 20, y = 20) означает, что labelB расположен в координате (20, 20).

Обработка события нажатия кнопки

Сначала мы напишем функцию, которая должна выполняться при нажатии кнопки:

def clicked (): lbl.configure (text = «Кнопка нажата !!») Язык кода: JavaScript (javascript)

Поэтому мы привяжем его к кнопке, указав такую ​​функцию:

btn = Button (window, text = «Click me», command = clicked) Язык кода: JavaScript (javascript)

Обратите внимание, что мы просто пишем clicked, а не clicked () в круглых скобках.

Теперь весь код будет выглядеть так:

from tkinter import * def clicked (): lbl.configure (text = «Кнопка нажата !!») window = Tk () window.title («Добро пожаловать!») window.geometry (‘350×200’) lbl = Label (window, text = «Hello!») lbl.grid (column = 0, row = 0) btn = Button (window, text = «Click me», command = click) btn.grid (column = 1, row = 0) окно основного цикла () Язык кода: JavaScript (javascript)

При нажатии на кнопку получаем желаемый результат:

Хороший!

Установка фокуса на виджете ввода

это очень просто, все, что нам нужно сделать, это вызвать функцию фокуса:

txt.focus () Язык кода: CSS (css)

Когда вы запустите код, вы заметите, что можете сразу же начать вводить — курсор автоматически будет помещен в поле.

Подробнее об ориентации виджета

Как вы, наверное, заметили, использование метода pack () не дает нам большого контроля над тем, где находятся виджеты после их упаковки в основные контейнеры. Это не означает, что метод pack () непредсказуем: просто очевидно, что иногда размещение виджетов в одном столбце в окне с одним виджетом поверх предыдущего не обязательно соответствует нашей сложной эстетике.. В этих случаях мы можем использовать pack () с некоторыми интеллектуальными аргументами или grid (), другой метод для ориентации виджетов внутри контейнеров.

Изменив строки 15 и 16 предыдущего примера, мы можем немного улучшить наш интерфейс:

simple_label.pack (fill = «x») close_button.pack (fill = «x»)

Производство:

Ориентация виджета

Таким простым способом мы указываем методу pack () растягивать метку и кнопку вдоль горизонтальной оси. Мы также можем изменить способ, которым pack () создает новые виджеты в окне. Например, используя следующий аргумент:

simple_label.pack (side = «left») close_button.pack (side = «left»)

Производство:

Виджет упаковки

Мы можем упаковать виджеты в ряд, начиная с левой стороны окна. Однако pack () — не единственный способ ориентировать виджеты внутри основных виджетов. Метод, который дает наилучшие результаты, — это, вероятно, метод grid (), который позволяет нам организовывать виджеты в строки и столбцы. Взгляните на следующий пример.

import tkinter root = tkinter.Tk () simple_label = tkinter.Label (root, text = «Easy, right?») Another_label = tkinter.Label (root, text = «More text») close_button = tkinter.Button (root, text = «Закрыть окно», command = root.destroy) another_button = tkinter.Button (root, text = «Не делать ничего») simple_label.grid (column = 0, line = 0, sticky = «ew») another_label.grid (column = 0, row = 1, sticky = «ew») close_button.grid (column = 1, row = 0, sticky = «ew») other_button.grid (column = 1, row = 1, sticky = «ew») root .mainloop()

Производство:

Использование функции pack()

Чтобы сделать этот пример более понятным, мы удалили строки, которые меняли заголовок и размер главного окна. В строках 6 и 8 мы добавили еще одну метку и еще одну кнопку (обратите внимание, что нажатие на нее не приведет к выполнению каких-либо операций, поскольку мы не добавляли к ней никаких команд).

Однако, что наиболее важно, во всех случаях pack () был заменен на grid (). Как вы можете легко догадаться, столбец и строка аргументов позволяют нам определить, какая ячейка сетки будет занимать наш виджет. Обратите внимание, что если вы определяете одинаковые координаты для двух разных виджетов, тот, который появится позже в вашем коде, будет отображаться поверх другого.

Прилагаемый аргумент, вероятно, не так очевиден. Используя эту опцию, мы можем привязать края наших виджетов к краям их соответствующих ячеек сетки: север (вверху), юг (внизу), восток (справа) и запад (слева). Мы делаем это, передавая простую строку, содержащую конфигурацию букв n, s, e и w.

В нашем примере мы вставляем края всех четырех виджетов к восточному и западному краям их ячеек, так что строка будет ew. В результате виджеты растягиваются по горизонтали. Вы можете играть с разными конфигурациями этих четырех букв. Их порядок в строке не имеет значения.

Теперь, когда вы знаете два разных метода ориентации виджетов, имейте в виду, что никогда не следует смешивать grid () и pack () внутри одного контейнера.

Frames

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

Давайте попробуем это с нашими четырьмя простыми виджетами:

import tkinter root = tkinter.Tk () frame_labels = tkinter.Frame (root, borderwidth = «2», поднял = «гребень») frame_buttons = tkinter.Frame (root, borderwidth = «2», поднял = «гребень») simple_label = tkinter.Label (frame_labels, text = «Легко, верно?») Another_label = tkinter.Label (frame_labels, text = «Другой текст») close_button = tkinter.Button (frame_buttons, text = «Close window», command = root destroy) Another_button = tkinter.Button (frame_buttons, text = «Не делать ничего») frame_labels.grid (column = 0, row = 0, sticky = «ns») frame_buttons.grid (column = 1, row = 0) simple_label.grid (column = 0, row = 0, sticky = «ew») Another_label.grid (column = 0, row = 1, sticky = «ew») close_button.pack (fill = «x») another_button.pack (fill = «x «) root.mainloop()

Производство:

Виджет кадра

Давайте подробнее рассмотрим пример, показанный выше. В строках 5 и 6 мы определяем два новых виджета Frame. Очевидно, что в первом аргументе мы указываем на их родительский виджет, которым является главное окно.

По умолчанию края кадра невидимы, но, допустим, мы хотели бы видеть, где именно они находятся. Чтобы показать их края, нам нужно дать им определенную ширину (в нашем примере 2 пикселя) и стиль тиснения (своего рода 3D-эффект), в котором будет отображаться граница. На выбор предлагается 5 различных стилей рельефа — в нашем примере мы используем гребень.

Определения Label и Button также были немного изменены (строки 8-12). Мы хотели разместить наши метки в наших frame_labels, а наши кнопки — в frame_buttons. Поэтому нам пришлось заменить их предыдущий родительский элемент, root, на соответствующие им новые родительские элементы фрейма.

В строках 14 и 15 мы ориентируем фреймы в корневом окне с помощью метода grid (). Затем мы используем метод grid () для ориентации меток (строки 17–18) и метод pack () для ориентации кнопок (строки 20–21). Ярлыки и кнопки теперь находятся в отдельных контейнерах, поэтому ничто не мешает нам ориентировать виджеты разными способами.

Отключение виджета ввода

Чтобы отключить виджет ввода, вы можете установить для свойства status значение disabled:

txt = Entry (window, width = 10, state = ‘disabled’) Язык кода: JavaScript (javascript)

Теперь вы больше не можете вводить текст.

 

Оцените статью
Блог о Python