Как сделать графический интерфейс python
Python PyQt5: современные графические интерфейсы для Windows, MacOS и Linux
Статья подойдет в том числе и начинающим программистам, поэтому, не теряя времени, приступаем!
Содержание руководства:
1. Установка и настройка PyQt5
Скачайте и установите последнюю версию Python для вашей системы, а если Python уже на месте, то установите пакеты при помощи следующей команды (откройте командную строку, введите и нажмите Enter):
2. Основы PyQt5
Результат выполнения программы:
Теперь разберем код окна интерфейса с заголовком сверху. Если обсуждать кратко, то в первую очередь импортируем PyQt5 и его классы, полезные в создании виджета GUI, а затем создаем функцию main() для реализации оконного интерфейса.
3. Заголовок окна
Выполните следующий код:
Результат выполнения программы:
4. События и кнопки
Результат выполнения программы:
Теперь пришел черед событийно-ориентированного программирования (Event-Driven-Programming)! Проще говоря, нужно определить действие для кнопки, то есть, если пользователь на нее нажмет, то что-то должно произойти. Ознакомьтесь со следующим кодом, а дальше рассмотрим подробные объяснения:
5. Поля ввода
Посмотрите на следующий код и обратите внимание на его результат:
Результат выполнения программы:
6. Окна сообщений и всплывающие окна
Окна сообщений и всплывающие окна (popups) — это альтернативные маленькие окна, например, вы создаете программу для регистрации электронной почты, а пользователь не ввел надежный пароль, тогда вы предупреждаете пользователя об этом через окна сообщений.
Проанализируйте следующий код:
Результат выполнения программы:
Также в окне сообщения всегда можно показать специальный значок, как показано в следующем коде и результате его выполнения:
Результат выполнения программы:
Ниже приведен список допустимых для окон сообщений значков:
Выводы
PyGame
Напишем к нашему проекту (игре) графический интерфейс (GUI).
Есть много библиотек для создания GUI на python: PyQt (сложная, много может), PyGtk (тоже кроссплатформенная), tkinter (проще).
Для создания GUI игр тоже есть специальные библиотеки, например PyGame и ее упрощение для детей PyGame Zero
Ссылки
Основные концепции GUI на примере tkinter
Внимание, в Windows файлы *.pyw запускаются программой pythonw.exe, а не python.exe, поэтому при запуске не будет консоли. В Linux разницы в расширениях нет.
Жизненный цикл консольной программы и программы с GUI. Рис 13.1 Саммерфилд
Event-Listener
Любое действие с GUI порождает событие (event). Например, нажатие Shift на клавиатуре, движение мыши или нажатие ее кнопки. Его получают те части GUI, которые подписались (слушают) это событие. Много разных частей могут услышать 1 событие. Разные части могут по-разному отреагировать на одно и то же событие.
Hello, world!
Напишем простейшую программу с GUI на tkinter.
Linux, Gnome
Windows:
Окно декорируется (выглядит) согласно оконному менеджеру или стилю, принятому в операционной системе.
В Windows или на Mac это окно будет выглядеть, как принято выглядеть окнам в Windows или на Mac.
Добавим заранее приготовленное изображение в виде логотипа python как Label.
Если хотим написать текст поверх картинки, указываем и картинку, и текст в одной и той же Label
Внимание! Необходимо хранить ссылку на картинку, чтобы она была показана.
Шрифт и цвет
Динамическое изменение Label по таймеру
Список widget (не полный)
Использование tkinter в ООП стиле
Напишем GUI с классами, используя библиотеку tkinter.
Пока не будем использовать наследование, обойдемся композицией. Окно состоит из надписи и двух кнопок.
Добавим к Label (надпись) еще и Button (кнопку). По нажатию на кнопку greet_button вызывается метод self.greet, который печатает «Greetings!».
Заметьте как связана кнопка close_button и закрытие всего окна.
Можно положиться на метод pack(), который упакует виджеты один за другим в родительский контейнер, сверху вниз. Удобно для простейших окон.
Можно указать в pack параметр side. Чуть более сложное расположение виджетов. Но окно еще простое.
Дополнительная информация (пропустить при первом чтении):
При изменении размеров окна в меньшую сторону первым исчезнет последний добавленный виджет. Так что порядок добавления виджетов имеет значение.
Порядок прикрепления имеет значение и при распределения занимаемой области:
Выглядят одинаково, но во втором случае при черезмерном сжатии сначала исчезает метка, потом кнопки.
Тут метку создали (в коде!) между кнопок:
Добавим expand и fill
Чтобы при увеличении окна увеличивались все лежащие в нем компоненты, нужно сделать их контейнер расширяемым.
Виджеты расширяются за пределы своего начального положения, только если расширяются все их родители.
Добавим anchor вместо растягивания:
Для сложных окон используйте grid().
Выравнивание в параметре sticky идет по сторонам света: N, S, W, E.
По умолчанию выравнивание по центру (по горизонтали и по вертикали).
W+E означает «растянуть слева направо».
Можно указать комбинацию NE, SW и так далее.
Кроме columnspan есть rowspan (на скольких столбцах или строках расположен виджет).
Не смешивайте в одном контейнере pack и grid! Положите несколько виджетов в разные Frame и компонуйте дальше эти Frame другим layout manager.
Custom Events
Рассмотрим изменение примера, где Label меняет свой текст по клику мыши.
Однако, мы не ограничены этими определенными событиями и можем заставить виджет слушать другие события и связать с ними функции-обработчики, используя метод bind(), который есть в каждом классе виджетов.
Событие однозначно идентифицируются по имени последовательности в виде строки на мини-языке, который не является специфичным для python. Вот несколько примеров обычных событий:
Заметьте, что обработчику событий cycle_label_text(self, event) передается объект event, в котором описана дополнительная информация о событии.
Можно назначит один и тот же обработчик на разные события.
Калькулятор
Напишем калькулятор, который умеет только складывать и вычитать введенные числа. Кнопка reset должна обнулять результат.
Если введены плохие данные, то нужно научиться проверять данные и реагировать на плохой ввод.
ООП с наследованием
Напишем программу в настоящем ООП стиле с наследованием.
Будем наследоваться от класса, который представляет отдельное окно.
От кого наследовать главное окно приложения? tkinter.Toplevel или tkinter.ttk.Frame.
Лутц, Программирование на Python, главы 7-11
Добавление пользовательских обработчиков событий (event handler)
lambda-функции
Хитрость: в lambda-функции может быть только 1 выражение, поэтому мы пишем print и exit в одно выражение, связывая их через or.
Отложенные вызовы
Иногда нужно в обработчик событий передать дополнительные данные.
Обычно функции как обработчики событий указываются без аргументов:
Что делать, если нужно передать в функцию-обработчик аргумент?
Ошибка! Функция hi будет вызвана не в момент нажатия кнопки, а при ее создании.
Вариант 1: пишем функцию-обертку и вызываем обертку.
Вариант 2: отложенный вызов.
Этот вариант вы уже видели в калькуляторе.
Цитата: Вызов фактического обработчика откладывается, благодаря чему мы получаем возможность добавлять необходимые аргументы. В данном случае значение глобальной переменной X и строка «spam» будут переданы в аргументах A и B даже при том, что библиотека tkinter вызывает функции обратного вызова без аргументов. Таким образом, инструкция lambda может использоваться для отображения вызова без аргументов в вызов с аргументами, которые поставляются самим lambda-выражением.
из «плохо» делаем «хорошо» без lambda:
Проблемы с областями видимости для обработчиков
Как передавать данные в функции-обработчики?
Глобальные переменные
Тогда можно написать функцию handler без аргументов, а X и name сделать глобальными переменными.
Передача значений из объемлющей области видимости при помощи аргументов со значением по умолчанию
Х теперь не глобальная, а лежит в объемлющей области видимости. Все работает, как мы хотим:
Можно передать явно значение Х при вызове обработчика, сделав его значением по умолчанию.
Значения по умолчанию вычисляются при создании, а не при вызове функции. Поэтому тут явно гарантируется значение 42 (которое вычисляеся при выполнении lambda-выражения). Позже библиотекой будет вызвана lambda-функция без аргументов, поэтому все ее аргументы получат значения по умолчанию.
Передача значений из объемлющей области видимости с помощью автоматических ссылок
Оба примера выше в результате делают одно и то же. Но внутри lambda-выражения ссылки на переменную из объемлющей области видимости разрешаются в момет вызова этой функции, а не в момет ее создания.
С одной стороны получаем плюс, можно написать значение переменной после написания lambda-выражения.
Переменная до lambda-выражения. Все работает, как ожидается.
Переменная после lambda-выражения. Тоже работает, потому что поиск значения переменной начинается только при ее вызове.
Видно, что в момент создания вложенной функции action переменная spam даже не была определена. Разрешение имени spam происходит во время вызова функции action.
То же справедливо и для lambda-выражений.
и это тоже работает:
Чуть подробнее о связывании:
В GUI часто виджеты (и их обработчики) создаются в цикле. При этом можем получить:
В этом случае поможет передача значения по умолчанию:
То же правило действует, если объемлющей областью является модуль, а не другая функция:
Вывод: используем ссылки на переменные в объемлющей функции видимости, если переменные не будут изменяться, иначе передаем их значениями по умолчанию
Использовать ссылку на внешнюю переменную цикла внутри вложенной функции неразумно. Тогда передаем значение этой переменной как значение по умолчанию.
Связанные методы класса как обработчики событий
Хоть вызывается метод quit без аргументов, но на самом деле он получает аргумент self.
Если мы заходим вызвать метод по имени класса command=HelloClass.quit, то произойдет ошибка «quit() missing 1 required positional argument: ‘self'»
Заметим, что фактически в методе quit мы нигде не пользовались, что это метод объекта класса (т.е. не использовали self). Если мы напишем обработчик как статический метод quit2, то его можно будет вызвать и по self.quit2 и по имени класса HelloClass.quit2.
Перепишем handler с X=42 и name=’spam’ в виде класса:
Объекты вызываемых классов как обработчики событий
Объект класса может вызываться как функция, если у класса переопределен метод __call__.
Экземпляр класса, зарегистрированный в command, может вызываться как обычная функция. Python вызовет его метод __call__.
Связывание событий
Покажем, как нажатие на кнопку можно связать не через параметр command, а через функцию bind()
Приветствую любителей языка Python!
Поскольку на форуме я не заметил программ с GUI, то решил дать несколько базовых уроков.
Есть почитатели как и консольных вариантов, так и GUI. И вопрос что лучше совершенно неверный. Самые сложные программы всегда стараются сделать с оболочкой, иначе софт обрастает диким количеством опций, в которых трудно разобраться. Кроме этого, если программа пишется не для личного пользования, то нужно учитывать, что большая часть юзеров сидит под ОС Windows, и привыкла к графике. Поэтому даже если вы ярый приверженец консоли, но например, делаете программы на заказ, то уметь писать программы с оболочкой просто необходимо.
Есть много вариантов Python GUI. Вот неполный список:
Tkinter
PyGTK
PySide
PyQt
wxPython
Мы будем делать интерфейс с помощью Tkinter. Главным преимуществом его является встроенность в Python. То есть не понадобится устанавливать каких-то сторонних модулей, библиотек и прочего ПО. Из минусов можно отметить менее презентабельный внешний вид по сравнению с другими фреймворками и обёртками.
Начнём с заготовки, которая будет главным скилетом, на который можно накидать всё что угодно.
Запускаем, и получим такое окошко
Теперь пройдёмся по коду и разберёмся что там написано.
Самый простой и популярный метод pack(), применяется для самых простеньких программ. Метод place() почти не используется, а метод grid() самый сложный и самый точный. У него больше всего возможностей, и он позволяет расположить элементы именно так как вы это задумали.
Добавим к нашей программе кнопку
И вот кнопка у нас появилась
btn1 = Button(text=»BUTTON», background=»#000000″, foreground=»#fff», padx=»15″, pady=»2″, font=»12″) Здесь мы создали Button с названием btn1, написали на кнопке текст BUTTON, и задали цвета для текста и фона кнопки. Также установлены отступы от текста по осям x и y, и размер шрифта. У шрифта можно не только менять размер, но и сам стиль шрифта. Поставьте например font=»Arial 10″ и сравните результаты.
Виджет Label или текстовая метка. Добавим её в наш код
Графический пользовательский интерфейс в питон
Пользовательский графический интерфейс с Tkinter в Python Питон.
В этом уроке мы разберём создание простого графического пользовательского интерфейса (GUI) в Python Питон.
GUI расшифровывается как Graphical User Interface. На русском это означает пользовательский графический интерфейс. GUI используется во всех современных программах, он позволяет значительно облегчить работу с этими программами.
Для создания GUI в Python используется модуль tkinter. Импортируем этот модуль в нашу программу.
import tkinter as tk
Для создания GUI в Питоне нужно создать окно для него. Чтобы создать окно win, используйте команду tk.Tk()
win = tk.Tk()
В конце любой программы на tkinter в Питон нужно писать команду win.mainloop(), win это название окна для интерфейса. Команда mainloop() не позволяет окну закрываться сразу же при исполнении программы. Если не поместить эту команду в конец программы на Python, то окно для интерфейса закроется сразу же после запуска программы.
win.mainloop()
Изменим название окна для интерфейса Питон с помощью команды win.title(“”). В кавычках пишется текст, который будет отображаться в названии окна.
win.title(«itrobo.ru»)
Зададим окно размером 350×200 пикселей. Для этого в Python используется команда win.geometry(AxB), где A это ширина окна, B это высота окна. A и B пишутся в кавычках и разделяются символом “x”.
win.geometry(«350×200»)
Элементы в tkinter в Питоне создаются с помощью команды
элемент = tk.название_элемента(параметры_элемента)
Элемент метка label в Python
Пример программы на Python графический интерфейс метка
import tkinter as tk
win = tk.Tk()
win.title(«itrobo.ru»)
win.geometry(«300×300»)
res = tk.Label(win, text = «Привет»)
res.grid(row = 3, column = 0)
win.mainloop()
Для изменения надписи на метке используется команда имя метки.configure(text=»новый текст метки»)
Например
res.configure(text=»мою надпись поменяли»)
Элемент Button кнопка в Python
Чтобы задать кнопку в графическом интерфейсе python необходимо использовать команду
название объекта кнопка = tk.Button(win, text = “надпись на кнопке”, сomand = имя функции при нажатии)
Например
button=tk.Button(win, text = “нажми меня”, comand =onclick)
создаст нкнопку с именем button надпись на кнопке Нажми меня, при нажатии будет вызываться процедура onclik
для вывода кнопки на экран мы используем разметку и команду
имя кнопки.grid(row = номер строки, column = номер столбца)
например
button.grid(row = 1, column = 1)
Приведем пример программы графический интерфейс на Python с кнопкой и меткой, при нажатии на кнпоку название метки меняется на Меня нажали
import tkinter as tk
win = tk.Tk()
win.title(«itrobo.ru»)
win.geometry(«300×300»)
res = tk.Label(win, text = «-«)
res.grid(row = 3, column = 0)
def onclick():
res.configure(text = «меня нажали»)
button = tk.Button(win, text = «нажми меня», command = onclick)
button.grid(row = 1, column = 1)
win.mainloop()
Элемент текстовое поле в графическом интерфейсе python
Для задания тектового поля в графическом пользовательском интерфейсе Python используется команда
имя текстового поля=tk.Entry(имя окна)
например команда
text1=tk.Entry(win)
cоздаст объект текстовое поле с именем text1 в окне win
для отображения в окне интерфейса python используется команда
имя элемента.grid(row=номер строки, column=номер столбца)
Например
text1.grid(row=1,column=1)
Чтобы получить данные из текстового поля в Python используется команда
имя поля.get()
Например
znach=float(text1.get())
записывает в переменную znach числовое значение поля text1
Пример программы с графическим пользовательским интерфейсом в Python простейший калькулятор
Сделаем программу калькулятор на Python. В двух текстовых полях пользователь вводит два числа. При нажатии на кнопку в метке будет показываться сумма этих чисел.
Введём два текстовых поля и метку. Первое поле назовём num1, второе num2, метку назовём res. Зададим кнопку button. Поля для ввода текста задаются с помощью команды tk.Entry(win)
num1 = tk.Entry(win)
num1.grid(row = 0, column = 0)
num2 = tk.Entry(win)
num2.grid(row = 2, column = 0)
res = tk.Label(win, text = «-«)
res.grid(row = 3, column = 0)
Зададим кнопку button с помощью команды
button = tk.Button(win, text = “Сумма”)
button это название кнопки, win это окно, где отображается кнопка, text = “Сумма” это параметр, определяющий текст на кнопке.
Если вы просто зададите кнопку, запустите программу на Питоне и нажмёте на кнопку, ничего не произойдёт. Чтобы задать действие по нажатию кнопки, нужно использовать параметр кнопки command. Разберём процедуру нахождения суммы и нажатия кнопки.
При нажатии на кнопку в Python мы должны получить значения двух чисел в текстовых полях, сложить эти числа и вывести сумму в метку. Создадим для этого отдельную процедуру summation(). Подробно о процедурах в Python
Чтобы получить числа из текстовых полей в Питоне, используем команду num1.get() Обратите внимание, что текстовые поля всегда возвращают данные в виде строк, поэтому переведём их числа, используя команду float()
one = float(num1.get())
two = float(num2.get())
Теперь создадим переменную result, в которой будет храниться сумма полученных чисел.
result = one + two
После того, как мы задали метку res с результатом в Питон, нужно изменить текст в ней с “-” на результат. Это можно сделать с помощью команды res.configure(text) и форматированного вывода.
res.configure(text = «= %s» % result)
После того, как мы создали процедуру для вывода чисел в Python, назначим нажатие кнопки на неё. Это можно сделать, присвоив параметр command созданной процедуре.
button = tk.Button(win, text = «Сумма», command = summation)
button.grid(row = 1, column = 1)
Полный код программы на python с графическим пользовательским интерфейсом простейший калькулятор.
import tkinter as tk
win = tk.Tk()
win.title(«itrobo.ru»)
win.geometry(«400×400»)
num1 = tk.Entry(win)
num1.grid(row = 0, column = 0)
num2 = tk.Entry(win)
num2.grid(row = 2, column = 0)
res = tk.Label(win, text = «-«)
res.grid(row = 3, column = 0)
def summation():
one = float(num1.get())
two = float(num2.get())
result = one + two
res.configure(text = «= %s» % result)
button = tk.Button(win, text = «Сумма», command = summation)
button.grid(row = 1, column = 1)
win.mainloop()
Создание графического интерфейса на Python с Tkinter. Обучение Python GUI
Графический интерфейс – неотъемлемая составляющая любого современного приложения. Даже во времена MS DOS, несмотря на тотальное доминирование командной строки в те времена, все равно начали появляться первые графические интерфейсы. Чего только стоит легендарный файловый менеджер Norton Commander? А для создания игр работа с графическими интерфейсами вообще является приоритетной.
В Python работа с графическими интерфейсами осуществляется с помощью библиотеки Tkinter. Она предустановлена в язык, поэтому ее можно использовать сразу, без дополнительной установки.
Пример приложения, созданного с применением Tkinter – IDLE. Это очень популярная среда разработки приложений для Python.
Рекомендуется пользоваться Python 3.7 для того, чтобы проверять нашу инструкцию. Дело в том, что третья версия претерпела настолько существенные изменения, что использование второй версии уже далеко от реального программирования.
В этой инструкции мы будем подразумевать, что базовое представление о Python у Вас уже есть. Мы же будем говорить о том, как создавать окно, что такое виджеты и как их добавить и редактировать. Давайте начинать.
Создаем свой первый графический интерфейс
Перед тем, как использовать эту библиотеку, ее следует импортировать. После этого уже можно прописывать строки для настройки окна.
from tkinter import *
window.title(«Добро пожаловать в приложение Python»)
Все, теперь мы создали приложение с графической оболочкой. Поздравляем.
Создаем виджет Label
Окно – это, конечно, прекрасно. Но что делать, если нам надо отобразить в нем какую-то надпись? Например, слово «Привет». Как это сделать?
Сначала необходимо добавить виджет. Для этого объявляется переменная (в нашем случае – lbl ) с использованием следующего кода.
lbl = Label(window, text=»Привет»)
После этого мы задаем место, в котором будет размещаться наша надпись. В нашем случае это будет самый верх окна слева. Соответственно, необходимо задать такое положение:
После того, как мы добавим эти строки в приведенный выше код (а добавлять их надо после той строки, где задается заголовок), получится следующий.
from tkinter import *
window.title(«Добро пожаловать в приложение Python»)
lbl = Label(window, text=»Привет»)
Настраиваем размер и шрифт текста
lbl = Label(window, text=»Привет», font=(«Arial Bold», 50))
Этот параметр может использоваться, в том числе, и для других виджетов. Его можно применять не только к надписи. Если в виджете есть шрифт, его можно изменять.
Настраиваем размеры окна приложения
Программа у нас получилась отличная, конечно. Но, скажите, чего-то не хватает. Все правильно, окошко хотелось бы побольше. Что можно сделать для того, чтобы увеличить его?
Чтобы это сделать, используется метод geometry с аргументом в виде размеров окна, записанных в виде строки в формате «ширина»х«высота».
Эта строка делает размер окна по ширине 500 пикселей, а по высоте – 250.
Видим, что нет ничего сложного. Но этого явно недостаточно для создания функционального приложения, которое будет взаимодействовать с пользователем. Например, не хватает кнопок. Давайте посмотрим, как добавлять на наше окно кнопку и обрабатывать ее нажатие.
Добавляем виджет Button
Теперь нам нужно добавить кнопку. Чтобы это сделать, необходимо создать объект соответствующего класса, а в свойствах задать текст, который будет на ней отображаться.
btn = Button(window, text=»Не нажимать!»)
Мы добавили кнопку после метки в коде. В целом, у нас получилась такая программа.
from tkinter import *
window.title(«Добро пожаловать в приложение Python»)
lbl = Label(window, text=»Привет», font=(«Arial Bold», 50))
btn = Button(window, text=»Не нажимать!»)
После того, как этот код будет запущен, получится следующий результат.
Заметьте, что в коде выше мы указали позиционирование кнопки во втором столбце. Но поскольку индексация начинается с нуля, то, соответственно, мы написали индекс столбца 1. Если же его разместить с координатами 0,0, то он просто заменит надпись.
Как изменить цвет текста и фона у Button?
Кастомизация кнопок не ограничивается одним лишь изменением размера и начертания шрифтов. Например, можно сделать кнопку черной, а буквы на ней – красными. Для этого надо прописать соответствующие свойства: fg и bg. Они позволяют настроить цвет надписи и фон соответственно.
Точно так же, как и с размером и начертанием шрифта, с помощью этих свойств можно редактировать внешний вид любого другого элемента, не только кнопки.
А теперь приведем пример кода, с помощью которого мы сделали надпись кнопки красной на черном фоне.
btn = Button(window, text=»Не нажимать!», bg=»black», fg=»red»)
Хорошо, а что сейчас будет, если нажать на кнопку? Если вы попробовали у себя написать аналогичный код, то вы увидите, что ничего не произойдет. Дело в том, что не был настроен обработчик события. Это такая функция, которая активируется при наступлении определенного события.
Кнопка Click
Давайте попробуем прописать действия приложения на случай, если пользователь таки попробует нажать на эту кнопку. Как это делается?
Для начала необходимо прописать ту функцию, которая активируется при нажатии кнопки (то есть, будет служить обработчиком событий).
lbl.configure(text=»Я же просил…»)
После этого она прописывается в качестве свойства command таким образом:
btn = Button(window, text=»Не нажимать!», command=clicked)
Заметьте, что мы используем название функции обработчика событий без скобок.
Если мы запустим этот код, то увидим, что надпись изменилась на «Я же просил».
Вот, что уже умеет наша программа. Но это еще не все.
Получение ввода при помощи класса Entry (текстовое поле Tkinter)
Раньше мы рассматривали самые простые виджеты, которые работали на вывод и простейший ввод (в виде нажатия кнопки). Теперь же мы рассмотрим, как вводить конкретную информацию в поле ввода, используя класс Entry. С его помощью можно добавить в программу такое текстовое поле, которое вы привыкли видеть в других приложениях.
Чтобы его добавить, необходимо создать объект соответствующего класса и присвоить его переменной. Для этого используется следующая строка кода.
txt = Entry(window, width=10)
Итоговый код получился следующим.
from tkinter import *
lbl.configure(text=»Я же просил…»)
window.title(«Добро пожаловать в приложение Python»)
lbl = Label(window, text=»Привет»)
btn = Button(window, text=»Не нажимать!», command=clicked)
Ну, соответственно, программа будет выглядеть так.
Тем не менее, в этом коде есть недостаток. Попробуйте вчитаться в него и понять, в чем он заключается. Дело в том, что при нажатии кнопки будет выдаваться старое сообщение, текст в поле не обрабатывается. Как же сделать так, чтобы приложение могло «считывать» его?
res = «Привет <>».format(txt.get())
Соответственно, теперь после нажатия на кнопку программа считает с текстового поля его содержимое и отобразит текст «Привет» вместе с тем текстом, который пользователь указал на предыдущем этапе.
Ну и небольшая демонстрация окна программы, в которой реализован этот функционал.
Фокус виджета ввода
А знаете, в чем еще проблема этого приложения? В том, что нужно вручную настраивать фокус ввода. То есть, нельзя сразу вводить текст после того, как программа запустится. Как же осуществить автоматическую настройку фокуса? Для этого необходимо вызвать одноименную функцию.
При запуске кода вы увидите, что текст можно будет написать сразу, поскольку курсор стоит непосредственно в поле ввода. Это значительно упрощает взаимодействие с программой.
Отключение виджета ввода
Отключение виджета ввода – это операция, вследствие которой он отображается серым цветом, а пользователь не имеет возможности вводить туда текст. Для того, чтобы деактивировать виджет, необходимо выставить его состояние, как «disabled». Приведем фрагмент кода, как это делается.
txt = Entry(window,width=10, state=’disabled’)
После того, как вы запустите программу, вы увидите, что поле ввода заблокировано, и не имеете никакой возможности ввести текст. Применений этой возможности много. Например, блокировка поля пароля при трехразовом неправильном вводе.
Добавляем виджет Combobox
Combobox – это выпадающий список. Чтобы его добавить, необходимо создать объект соответствующего класса.
from tkinter.ttk import Combobox
Далее необходимо присвоить значения для поля ввода и разместить поле ввода в подходящее место окна.
combo[‘values’] = (1, 2, 3, 4, 5, «Текст»)
combo.current(1) # установите вариант по умолчанию
Добавляем виджет Checkbutton (чекбокс)
Чтобы добавить виджет Checkbutton, необходимо добавить объект соответствующего класса.
from tkinter.ttk import Checkbutton
chk = Checkbutton(window, text=’Выбрать’)
Установка состояния с помощью intvar()
Установка состояния с помощью booleanvar()
chk_state.set(True) # задайте проверку состояния чекбокса
Результат от использования BooleanVar и IntVar одинаковые. Можно использовать тот, который больше нравится.
Добавляем виджеты RadioButton
Радиокнопки – один из любимых виджетов пользователей любых программ. Выглядят они так.
Чтобы их добавить, действия аналогичные предыдущим, только присоединяется класс Radiobutton.
rad1 = Radiobutton(window, text=’Первый’, value=1)
rad2 = Radiobutton(window, text=’Второй’, value=2)
rad3 = Radiobutton(window, text=’Третий’, value=3)
И, аналогично предыдущим виджетам, необходимо задать позицию радиокнопок. Они должны располагаться на разных местах.
Также можно настроить радиокнопку так, чтобы она работала, как обычная кнопка. То есть, можно сделать обработчик события на нажатие. Делается это таким образом.
rad1 = Radiobutton(window,text=’Первая’, value=1, command=clicked)
Получаем значение Radio Button (избранная Radio Button)
Для получения значения радиокнопки и той, которая сейчас выбрана, необходимо передать соответствующий параметр переменной, а потом просто получить ее значение.
Добавляем виджет ScrolledText (текстовая область Tkinter)
Чтобы добавить большое текстовое поле, необходимо присвоить соответствующей переменной объект класса ScrolledText:
from tkinter import scrolledtext
Видим, что в свойствах необходимо указать ширину и высоту. Можно этого не делать. В таком случае текстовое поле займет область всего окна.
Результат получится приблизительно следующим.
Настраиваем содержимое
txt.insert(INSERT, ‘Поле для ввода текста’)
Удаление/Очистка содержимого Scrolledtext
Создаем всплывающее окно с сообщением
Всплывающие окна – важные составляющие любого программного обеспечения. Они позволяют быстро проинформировать пользователя о чем-то, не изменяя содержимого основного окна.
Они создаются таким образом.
from tkinter import messagebox
Например, можно прописать обработчик клика по кнопке, в котором предусмотрено всплывающее окно.
Показ сообщений о предупреждениях и ошибках
Также возможна настройка показа предупреждающего окна или же уведомления об ошибках. Отличается только функция, которая отображает окно.
messagebox.showwarning(‘Заголовок’, ‘Текст’) # показывает предупреждающее сообщение
messagebox.showerror(‘Заголовок’, ‘Текст’) # показывает сообщение об ошибке
Показ диалоговых окон с выбором варианта
Диалоговые окна бывают разными. Например, можно настроить показ такого окна, который выдавал бы варианты ответа. Если вы знаете язык, вы с легкостью догадаетесь, что означает каждая из этих команд.
res = messagebox.askquestion(‘Заголовок’, ‘Текст’)
res = messagebox.askyesno(‘Заголовок’, ‘Текст’)
res = messagebox.askyesnocancel(‘Заголовок’, ‘Текст’)
res = messagebox.askokcancel(‘Заголовок’, ‘Текст’)
res = messagebox.askretrycancel(‘Заголовок’, ‘Текст’)
Добавление SpinBox (Виджет спинбокс)
Spinbox – это такое поле ввода со стрелками. Добавляется он с помощью команды
spin = Spinbox(window, from_=0, to=100)
Соответственно, параметры from и to отвечают за диапазон допустимых значений.
Значение по умолчанию для Spinbox
spin = Spinbox(window, from_=0, to=100, width=5, textvariable=var)
Добавляем виджет Progressbar
Как и с предыдущими вариантами, для добавления шкалы прогресса, нужно использовать соответствующий класс.
from tkinter.ttk import Progressbar
bar = Progressbar(window, length=200)
Меняем цвет Progressbar
Схема изменения цвета Progressbar довольно сложная и требует отдельного рассмотрения. В целом, механика следующая: нужно создать стиль, задать цвет фона, а потом перенести его на Progressbar.
Добавляем поле загрузки файла
from tkinter import filedialog
Указываем тип файлов (расширение фильтра файлов)
file = filedialog.askopenfilename(filetypes = ((«Text files»,»*.txt»),(«all files»,»*.*»)))
Добавление панели меню
Видим, что сначала создается меню, а потом добавляются команды. А добавление подменю осуществляется так.
Добавляем виджет Notebook (управление вкладкой)
Также Python позволяет создавать вкладки. Последовательность действий довольно сложная, и эта тема требует отдельного рассмотрения:
Добавляем виджет на вкладку
Чтобы добавить виджет на вкладку, необходимо назначить родительское свойство той, на которую осуществляется добавление.
Добавляем интервал для виджетов (заполнение)
Для этого используются свойства padx и pady.
lbl1 = Label(tab1, text= ‘label1’, padx=5, pady=5)
Как видим, тема очень обширная, и работа с каждым действием, описанным выше, требует отдельной статьи. Тем не менее, хочется надеяться, что Вы получили общее представление о том, как работать с графическим интерфейсом в Python.






























