Что такое Flask и как на нем быстро написать простой сайт

Рассказываем про один из самых популярных и лаконичных микрофреймворков для Python — Flask. Как написать простое приложение, подключить к нему Bootstrap и базу данных, и есть ли вообще у Flask минусы.
Flask — это микрофреймворк для создания веб-приложений на Python. В нем из коробки доступен только минимальный инструментарий, но при этом он поддерживает расширения так, как будто они реализованы в самом Flask. Расширения для микрофреймворка позволяют коммуницировать с базами данных, проверять формы, контролировать загрузку на сервер, работать с аутентификацией и многое другое.
Первая публичная версия Flask вышла 16 апреля 2010 года. Автор проекта — Армин Ронахер, который возглавлял команду энтузиастов в Python-разработке Poocco. Flask основан на быстром и расширяемом механизме шаблонов Jinja и наборе инструментов Werkzeug. Кроме того, Flask использует одну из самых передовых служебных библиотек WSGI (Web Server Gateway Interface — стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером).
При этом WSGI тоже разработал Армин Ронахер. По его словам, идея Flask изначально была первоапрельской шуткой, которая стала популярной и превратилась в серьезное приложение.
Изучите Python на Хекслете Пройдите нашу профессию «Python-разработчик», чтобы поменять свою жизнь и стать бэкенд-программистом.
Плюсы и минусы Flask
Практически все плюсы и минусы Flask появились именно из-за того, что он является микрофреймворком.
- Простота. Flask легко установить и настроить.
- Гибкость. Микрофреймворк позволяет разработчикам самостоятельно выбирать технологии и инструменты, которые они хотят применять в своих проектах
- Расширяемость. Flask позволяет расширять функциональность с помощью плагинов и модулей, которые можно легко интегрировать в проект.
- Активное сообщество. Flask является одним из самых используемых фреймворков для Python, поэтому имеет большое комьюнити разработчиков.
При этом у Flask есть и свои недостатки:
- Отсутствие готовых решений. Разработчики изначально могут использовать во Flask только минимальный набор функциональности. Если же программисту нужны более широкие возможности, такие как аутентификация пользователя, ему придется добавить дополнительные библиотеки или реализовать это самостоятельно.
- Нет встроенной многопоточности. Flask был разработан как однопоточный фреймворк. И чтобы управлять многопоточными веб-приложениями, придется установить дополнительные библиотеки.
- Ограниченные возможности для масштабирования. Если проект начинает расти и усложняться, то могут появиться сложности в поддержке нужной функциональности.
То есть Flask можно удобно использовать в небольших проектах — он идеален для макетирования идей и быстрого прототипирования. При этом его редко используют в крупных проектах, и он плохо подходит для асинхронного программирования.
Как создать проект на Flask
Для начала работы с микрофреймворком нужно скачать последнюю версию Flask:
pip install Flask
Для примера мы напишем на Flask тестовое веб-приложение с минимальным функционалом. Как работают приложения такого типа:
- Пользователь вводит в браузере url, например — hexlet.io. В нашем тестовом приложении пользователь не будет вводить url, потому что мы будем работать с локальным сервером по адресу http://127.0.0.1:5000 .
- Браузер получает у DNS IP-адрес нужного нам сервера. DNS — это Domain Name System, распределенная системе серверов. Она работает как общая «контактная книга» в интернете.
- Браузер отправляет запрос по этому адресу и получает ответ. Как правило — в виде HTML-страницы.
- Браузер отображает содержимое страницы.
Итак, создадим файл hello.py и запишем в него следующий код:
Давайте подробно разберем, что делает код, который мы написали.
Первой строкой мы импортируем класс Flask . После этого мы создаем объект этого класса, передав первым аргументом имя модуля, — это и будет наше приложение для общения с веб-cервером. __name__ — это удобный способ передать именно то приложение, из которого запущен Flask.
Декоратор route() сообщает Flask, при обращении к какому URL-адресу запустится декорируемая разработчиком функция — в нашем примере это index . Последней строчкой мы открываем локальный веб-сервер с параметром debug=True — это позволит следить за всеми ошибками в логе программы.
Читайте также: Программирование на Python: особенности обучения, перспективы, ситуация на рынке труда
Запускаем веб-приложение через терминал:
Если мы все сделали правильно, то в терминале появятся эти сообщения:

В основном тут отображается служебная информация. Единственное, что нас интересует — сообщение, что наш локальный сервер запущен по адресу http://127.0.0.1:5000/ . В нем красными буквами указывается, что локальный сервер не подходит для продакшена. Но, так как мы реализовали тестовое приложение, то не будем деплоить его на реальный сервер.
Вернемся к коду. С помощью переменной части маршрута Flask может передавать в функцию аргументы.
В нашем примере значения просто появятся в браузере как часть строки. На стартовой странице нашего сайта будет запускаться функция index() . В ней пользователю, помимо приветствия, будет предлагаться нажать на ссылку, при клике на которую он перейдет на user/Аникин/Георгий . Этот URL-маршрут будет обрабатываться уже функцией get_user .
Функция get_user декорируется @app.route('/<surname>/<name>’) , а в адресной строке у нас /user/Аникин/Георгий . То есть наша функция получает аргументы из URL-адреса, эти значения лежат между косых скобок. По умолчанию тип таких значений string принимает любой текст без косой черты. Но переменные маршрутов могут быть и иных типов: int , float , path и других. Типы указываются в формате <тип:имя переменной> .
Структура приложения на Flask
Создадим подкаталог flask_app с такой структурой файлов и папок:

Чтобы написать приложение сложнее одной строки, в директории проекта должны находиться папки static и templates . Директория static содержит ресурсы, которые используются шаблонами. В том числе включая файлы CSS, JavaScript и картинки. Папка templates содержит только шаблоны с расширением *.html .
Заполним наши файлы кодом. Сначала — наш основной файл проекта app.py :
После этого — index.html :
И файл about.html :
Для отображения HTML-шаблонов мы используем функцию render_template() . В нашем коде она принимает только имя шаблона и возвращает строку с результатом рендеринга шаблона.
Однако render_template() может принимать неограниченное количество именованных аргументов, которые можно использовать в этом шаблоне. Это позволит решить проблему нашего тестового проекта — сейчас у нас две функции, две страницы, и очень много дублированного кода.
Напишем базовый шаблон base.html и пару его наследников. При этом блоки <% block smth %>… <% endblock %>— это части базового шаблона, которые можно заменить в наследнике. Переменные передаются по именам в конструкции << variable >> .
После появления файла с базовым HTML-шаблоном можем поправить наши остальные HTML-файлы:
Кроме того, нужно поправить и основной файл Flask-проекта app.py :
Подключаем Bootstrap
Bootstrap — это открытый и бесплатный набор инструментов для создания сайтов и веб-приложений.
В нашем проекте в папке templates у нас есть подкаталог bootstrap , а в нем файл base.html — это немного модифицированная заготовка сайта-документации Bootstrap-Flask:
В файлах index.html и about.html заменим строку наследования на:
Второй путь подключения Bootstrap к проекту на Flask — через CDN. Подробнее об этом можно почитать в документации фреймворка.
Читайте также: Как создатель Python Гвидо ван Россум устроился в Microsoft и теперь работает над развитием CPython
После подключения Bootstrap нужно будет немного поправить основной файл нашего проекта app.py :
Последним элементом нашего веб-приложения будет форма отправки. Для этого нужно немного модифицировать index.html :
Вообще, Bootstrap может добавить огромное количество элементов в приложение буквально в несколько кликов. Мы ограничились четырьмя — три поля и одна кнопка. Ключевой элемент здесь — это << super() >> .
Подключаем базу данных
Итак, у нас есть форма отправки, но она пока ничего не делает с данными. Для нас было бы неплохо хранить, обрабатывать и в будущем легко извлекать данные этих форм. Обычно такие задачи решают с помощью реляционных баз данных (далее БД).
Есть большое количество способов работы с SQL-запросами во Flask. Мы можем использовать, например, sqlite3 и чистый SQL, а можем — библиотеку sqlite3 для Python. Кроме того, можно обернуть чистые SQL-запросы в код, либо использовать Psycopg2 для работы с PostgresSQL в Python (мы рекомендуем делать именно так и вот почему). Для примера в этом тексте мы используем библиотеку Flask SQLAlchemy (расширение для Flask), которая предлагает технологию ORM для взаимодействия с БД.
Подключаем базу данных к нашему проекту через файл app.py :
В нашей БД появился класс Event c атрибутами, который наследуется от db.Model . Это позволяет с помощью SQLAlchemy создать таблицу event , а поля нашего класса сделать колонками этой таблицы. Кроме того, мы определили магический метод __str__ для строкового отображения экземпляров класса — это пригодится для отображения в HTML.
Для создания таблицы в блок if __name__ == ‘__main__’ мы добавили команду db.create_all() , а для обработки отправленной формы — метод add_event . Он работает с методом POST , который указывает Flask, что данные будут отправлены на сервер.
В методе POST мы считываем данные отправленной формы и создаем для каждой строки временную переменную. После этого мы создаем объект event класса Event , передаем наши временные переменные как именованные аргументы, добавляем event в БД и фиксируем изменения.
Нам осталось лишь немного поправить форму: в файле index.html в открывающем теге <form> добавим атрибуты action="<< url_for('add_event') >>" method="POST" . Теперь форма отправки по нажатию на кнопку «Записать» будет отправлять данные в базу данных.
Добавим страницу отображения наших записей в новый файл Events.html :
В файл app.py добавим view :
А в основном контейнере index.html добавим ссылку на эту страницу:
Наш тестовый проект на Flask готов! Его можно запустить на локальном сервере через команду python app.py (в некоторых случаях надо будет написать название директории перед названием файла app.py ).
Что еще почитать про Flask
Изучите Python на Хекслете Пройдите нашу профессию «Python-разработчик», чтобы поменять свою жизнь и стать бэкенд-программистом.
Пишем интерфейс на PyQt5, Пример готовой программы
Если вдруг так получилось, что для вашего проекта на Python понадобился интерфейс, а возиться с Tkinter не хочется, очевидным решением станет PyQt5. Из плюсов стоит отметить легкость и быстроту построения интерфейса, из минусов — это очень большой размер исполняемого файла (если такой конечно будет), по сравнению с тем же Tkinter.
Установка
Для работы нам понадобится библиотека для питона pyqt5 и Qt Creator. Как и большинство библиотек в Питоне, проще всего их ставить через имеющийся pip. Открываем командную строку (или PowerShell) с правами администратора и вводим
pip install pyqt5

Теперь переходим к установке Qt Creator, в нем нам нужен только дизайнер.
Заходим на сайт qt.io, жмем «Start for free»

Далее «Desktop & Mobile applications»


Наконец, мы получаем ссылочку на заветный инсталятор

По ходу установки не забываем проверить наличие компонента Qt Creator (он уже отмечен, но проверьте на всякий случай).

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


В списке компонентов проекта ищем файл формы, щелкаем по нему два раза, откроется редактор интерфейса.


Создаем простенький интерфейс и сохраняем.

Переходим в папку с проектом и копируем файл mainwindow.ui в папку Scripts, которая находится в папке с Python’ом, и вводим след. команду
./pyuic5.exe mainwindow.ui -o gui.py

Полученный gui.py перемещаем в папку с питоновским проектом и подключаем соответствующим кодом. (В данном примере главным файлом является main.py, в котором далее мы подключаем gui.py) (Скопировать код)

Пробуем запустить и ..

Работает 🙂 Но пока это просто интерфейс, давайте придадим ему жизни, добавив событие на кнопку.
Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Работа с Python PyQT Framework
Введение В этом руководстве мы рассмотрим, как использовать среду Python PyQT [https://www.riverbankcomputing.com/static/Docs/PyQt6/] для разработки графического интерфейса пользователя (GUI) для настольного приложения в Python. Популярные альтернативы Python для разработки графического интерфейса включают Tkinter [https://docs.python.org/3/library/tkinter.html], Kivy [https://kivy.org/#home], PySimpleGUI [https: // pysimplegui .readthedocs.io / en / latest /] и wxPython [https://www.wxpython.org/]. Примечание: на момент написания
Время чтения: 22 мин.
Вступление
В этом руководстве мы рассмотрим, как использовать среду Python PyQT для разработки графического интерфейса пользователя (GUI) для настольного приложения на Python.
Популярные альтернативы Python для разработки графического интерфейса включают Tkinter , Kivy , PySimpleGUI и wxPython .
Примечание. На момент написания этого руководства PyQt6 — это последняя и наиболее продвинутая версия инфраструктуры Python PyQT, а также версия, которую мы будем использовать.
Мы пройдем через процесс установки и познакомимся с ключевыми элементами PyQT, прежде чем перейти к менеджерам компоновки , виджетам , сигналам и слотам, а также к тому, как стилизовать виджеты , а также взглянем на файлы пользовательского интерфейса, и как создавать пользовательские интерфейсы с помощью интуитивно понятного интерфейса перетаскивания, который мы затем можем экспортировать в исполняемые скрипты Python:
Введение в PyQt
Менеджеры по компоновке
- Этикетки
- Кнопки
- Редактирование строки
- Поля со списком
- Радио-кнопки
- Отображение данных с помощью виджета таблицы
- Отображение данных с помощью виджета в виде дерева
Сигналы и слоты
Файлы пользовательского интерфейса
- qtDesigner
- Преобразование файлов пользовательского интерфейса в Python
Монтаж
Чтобы использовать фреймворк PyQt, нам сначала нужно установить его с помощью диспетчера пакетов pip.
Если в вашей системе установлен pip, давайте запустим следующую команду, чтобы установить новейшую версию PyQt:
Если pip install pyqt6 завершится неудачно, вы можете проверить наличие изменений при установке здесь .
Введение в PyQt
PyQt — это набор инструментов, который является продуктом библиотеки Qt и языка программирования Python. Поскольку PyQt является одним из наиболее часто используемых GUI-фреймворков для Python, существует как тонна хорошо написанной документации, так и большое сообщество.
Одним из основных классов PyQt является QWidget
- реализация виджета . Виджеты — это компоненты графического интерфейса и основные строительные блоки пользовательских интерфейсов. Виджет может быть меткой, кнопкой, меню, полем со списком, скроллером, панелью инструментов, диалоговым окном файла и т. Д.
Есть много виджетов, и чтобы привыкнуть к ним, нужно время. Мы рассмотрим наиболее часто используемые виджеты, которые по большей части будут присутствовать почти в каждом приложении PyQt.
Относительный порядок этих виджетов во фрейме приложения диктуется и управляется менеджером компоновки . Мы также рассмотрим доступные менеджеры компоновки и их влияние на расположение компонентов графического интерфейса.
Точкой входа в каждое приложение PyQt является QApplication , который представляет само приложение. Он обрабатывает всю инициализацию и «холст», на котором мы рисуем.
Примечание. Всегда существует только один QApplication , независимо от количества окон или модальных блоков в вашем приложении.
Давайте сделаем рывок и инициализируем приложение PyQt, а также инициализируем окно с пустым холстом:
Запуск этого кода инициализирует простое приложение:
Давайте рассмотрим эту инициализацию построчно.
Во-первых, мы импортируем встроенный sys который предоставляет нам функции для управления средой выполнения Python . В нашем случае мы будем использовать этот модуль для обработки статуса выхода приложения — когда пользователь нажимает кнопку «X»:
Затем мы можем импортировать QApplication (основу) и QWidget (компоненты GUI) из модуля PyQt6.QtWidgets
Далее, эта строка является требованием QT. Он инициализирует PyQT. Sys.argv содержит список всех аргументов командной строки, переданных приложению. Каждое созданное вами приложение с графическим интерфейсом пользователя должно иметь ровно один экземпляр QApplication.
Теперь, поскольку QApplication отвечает за инициализацию большинства элементов, участвующих в разработке приложений PyQt, мы хотим сначала создать его экземпляр. Конструктор принимает sys.argv поскольку вы также можете передавать аргументы командной строки :
Теперь в QApplication фактически нет окон. Запуск приложения без окна даст нам невидимый результат. Чтобы на самом деле представить окно в миксе, мы создадим корневой виджет , который также известен как оконный виджет . В любом случае он представляет собой самый нижний виджет, в который мы будем добавлять другие компоненты:
Давайте установим собственный заголовок окна с помощью setWindowTitle() :
Метод setGeometry() принимает 4 аргумента: x_coordinate , y_coordinate , width и height . x_coordinate и y_coordinate определяют исходную точку окна при отображении:
Теперь, чтобы отобразить созданный графический интерфейс на экране, мы вызываем метод show() в root :
Наконец, мы выполняем приложение через app.exec() и запускаем основной цикл приложения, пока пользователь не закроет его:
Менеджеры по компоновке
Менеджеры компоновки PyQt предоставляют нам эффективный способ упорядочивания виджетов PyQt в графическом интерфейсе. Чем лучше мы размещаем наши виджеты, тем более изысканным и профессиональным может выглядеть наше приложение с графическим интерфейсом пользователя. Неуклюжие, огромные промежутки между кнопками без особого использования пространства не очень удобны для пользователя. То же самое касается и наоборот — если мы поместим кнопки слишком близко, их станет неудобно легко нажимать неправильно.
Самыми популярными классами диспетчера макетов PyQt являются:
-
виджеты вертикально. виджеты по горизонтали. виджеты в сетке. виджеты в двух столбцах.
При создании приложений с графическим интерфейсом пользователя с PyQt вы часто будете использовать более одного из четырех менеджеров компоновки общего назначения, даже в одном приложении, для разных типов окон.
Давайте воспользуемся предыдущим примером и обновим его, добавив несколько виджетов, таких как QPushButton и управляя ими с помощью диспетчера макетов.
1. QVBoxLayout
Диспетчер макетов ящиков (как QVBox, так и QHBox) использует все пространство, которое он получает от родительского макета или виджета, и делит его на несколько ящиков.
Каждый виджет, управляемый менеджером, заполнит одно поле.
QVBoxLayout позволяет нам расположить наши виджеты вертикально. Макет добавляет виджеты к себе последовательно сверху вниз. Таким образом, первый виджет, добавленный в ваш код, будет самым верхним виджетом, а последний виджет, добавленный в ваш код, будет самым нижним виджетом в макете.
Давайте добавим несколько кнопок в наше приложение через QVBoxLayout :
Запустив этот код, мы увидим на экране следующее окно:
Это окно содержит 5 кнопок, расположенных вертикально сверху вниз. Когда мы нажимаем на них, ничего не происходит, потому что мы еще не добавили для них никакой логики.
2. QHBoxLayout
QHBoxLayout — это макет блока, который позволяет нам расположить наши виджеты по горизонтали. Макет добавляет виджеты к себе слева направо. Таким образом, первый виджет, добавленный в ваш код, будет самым левым виджетом, а последний виджет, добавленный в ваш код, будет самым правым виджетом в макете.
Заменим вертикальный прямоугольник на горизонтальный:
Запустив этот код, мы увидим на экране следующее окно:
Это окно содержит 5 кнопок, расположенных по горизонтали слева направо.
3. QGridLayout
QGridLayout используется, когда мы хотим расположить виджеты в сетке из строк и столбцов. В этой сетке, используя координаты, мы можем определить относительное положение каждого виджета как: (строка, столбец).
Примечание. И row и column должны быть целыми числами.
QGridLayout также использует все пространство, которое он получает от своего родительского макета или виджета, и делит его на несколько блоков. Как и в предыдущих менеджерах компоновки, каждый виджет помещается в свое собственное поле. Количество ящиков рассчитывается автоматически в зависимости от количества виджетов и их координат.
Давайте использовать QGridLayout вместо горизонтального прямоугольного макета:
Запустив этот код, мы увидим на экране следующее окно:
Это окно содержит 5 кнопок, которые расположены так, как мы указали в addWidget() . Сам метод принимает 3 аргумента:
- Виджет, который нужно разместить в сетке.
- Ряд, в который он должен быть помещен.
- Столбец, в который он должен быть помещен.
Существует необязательный четвертый аргумент, alignment , который определяет параметр выравнивания каждого Widget внутри своего поля. Значение по умолчанию ( Qt.Alignment.AlignCenter ) означает, что каждый виджет должен заполнять все свое поле от центра кнаружи. Подробнее о Qt в следующих разделах.
Наконец, есть также columnSpan и rowSpan , которые определяют, занимает ли виджет несколько строк или столбцов:
Qt.Alignment строк и столбцов, а также Qt.Alignment (до PyQt6 это был бы Qt.AlignLeft ):
Вы можете AlignLeft , AlignTop , AlignBottom , AlignRight и AlignCenter . Изменив размер окна, мы увидим, что каждая кнопка выровнена по левому краю своего поля, а не по центру:
Тогда как, если бы мы использовали AlignCenter или оставили его по умолчанию:
4. QFormLayout
QFormLayout упрощает создание макетов форм для настольных приложений. Он состоит из двух столбцов — для меток и для входов.
Обычно виджет ввода — это QLineEdit , QSpinBox , QComboBox или аналогичные виджеты ввода. Создадим QFormLayout :
Запустив этот код, мы увидим на экране следующее окно:
Это окно содержит 2 метки и 2 QLineEdit добавленных с помощью addRow() . addRow() принимает 2 аргумента:
- Текст метки (строка)
- Виджет ввода ( QWidget )
Метод автоматически создаст и добавит новый QLabel с нашим labelText в качестве текста. Кроме того, вы также можете добавить QLabel вместо строки, которая пропускает автоматическое преобразование:
Это также приводит к:
Виджеты
Теперь, когда мы знакомы с менеджерами компоновки, которые предлагает PyQt, давайте перейдем к тому, чем они управляют. Виджеты — это ключевая концепция Qt и, как следствие, PyQt.
Виджет отражает графический компонент пользовательского интерфейса. Пользовательский интерфейс состоит из нескольких виджетов, расположенных внутри окна. Каждый виджет содержит ряд атрибутов и методов, которые позволяют нам моделировать их внешний вид и поведение.
PyQt6 в настоящее время предлагает более 40 виджетов, и вы даже можете создавать свои собственные виджеты.
Начиная с PyQt5, базовые классы были перетасованы в разные модули. PyQt6 использует несколько фундаментальных высокоуровневых модулей, в том числе:
- Qt : Все модули, упомянутые ниже, могут быть упакованы вместе в один модуль.
- QtCore : QtCore содержит все основные неграфические модули, используемые другими модулями. В этом модуле реализованы сигналы, слоты и т. Д.
- QtWidgets : этот модуль содержит большинство виджетов, доступных в PyQt6.
- QtGui : QtGui расширяет QtCore и содержит компоненты графического интерфейса.
- QtSql : этот модуль реализует интеграцию базы данных для баз данных SQL.
- QtMultimedia : В этом модуле можно найти низкоуровневую мультимедийную функциональность.
- QtNetwork : Классы, используемые для реализации сетевого программирования (сокеты, обработка SSL, сетевые сеансы, DNS, . ), можно найти в этом модуле.
В этом разделе мы сосредоточимся на модуле QtWidgets и предлагаемых им виджетах.
1. Этикетки
Самый популярный виджет, метка , чаще всего используется для объяснения цели или использования вашего графического интерфейса, например, для аннотирования того, для чего предназначено поле.
Мы можем создать метку, вызвав класс QLabel Имейте в виду, что этот виджет не обеспечивает взаимодействия с пользователем.
Мы можем изменить внешний вид этикетки различными способами:
- setAlignment() выравнивает заголовок в соответствии с константами выравнивания, которые могут быть следующими:
- Alignment.AlignLeft
- Alignment.AlignRight
- Alignment.AlignCenter
- Alignment.AlignJustify
Теперь давайте создадим небольшое приложение PyQt6, используя только метки, чтобы отображать некоторую информацию о Бельгии:
Вы можете QLabel как с firstLabel . Затем, даже после добавления его в макет — вы можете манипулировать им и устанавливать текст, выравнивание и т. Д. С помощью его методов установки. Последние состояния, установленные установщиками, в конце будут отрисованы в окне.
Если вы не хотите создавать объекты заранее и не вызывать много методов
- вы можете просто создать виджет и добавить его сразу после, в самом addWidget() . Мы установили для аргумента wordWrap QLabel значение true, поскольку он немного длиннее двух других, и мы могли бы захотеть обернуть слова, если они длиннее, чем может вместить окно.
Примечание. Начиная с PyQt6, Qt является частью PyQt6.QtCore , а параметры Align_ являются частью Alignment приводит к Qt.Alignment.Align_ . До PyQt6 Qt был частью PyQtX , а не QtCore , а параметры Align_ были частью Qt поэтому вызовы были бы больше похожи на Qt.Align_ вместо этого.
Если мы запустим этот код, мы увидим наши три метки, выровненные в соответствии с нашими настройками Alignment
2. Сигналы и слоты
Сигналы и слоты в PyQt используются для связи между объектами. Этот механизм является центральной особенностью фреймворка Qt.
Например, если пользователь нажмет кнопку «Удалить» , мы хотим, чтобы вызывалась функция delete() Для этого 2 виджета должны взаимодействовать друг с другом.
Событие — это действие, выполняемое пользователем в нашем графическом интерфейсе.
Когда происходит событие, соответствующий виджет излучает сигнал. Виджеты, доступные в Qt, имеют много предопределенных сигналов, но вы всегда можете сделать дополнительные настраиваемые сигналы.
Слот — это функция, которая вызывается в ответ на сигнал . И снова у виджетов, доступных в Qt, есть много предопределенных слотов, но очень распространенной практикой является создание собственных.
Наиболее полезные функции сигналов и слотов включают в себя:
- Сигнал может быть подключен к другому сигналу
- Сигнал может быть подключен к одному или нескольким слотам
- Слот может быть подключен к одному или нескольким сигналам
Общий синтаксис подключения сигнала к слоту:
Этот код соединит slot_function с Widget.signal , и всякий раз, когда будет испускаться сигнал, будет вызываться функция slot_function()
Чтобы избежать неожиданного поведения, важно аннотировать каждую функцию слота с помощью декоратора @pyqtSlot()
Теперь давайте создадим приложение, которое использует механизм сигналов и слотов, поместив кнопку, которая просто выводит сообщение на консоль:
Запустив этот код, мы увидим на экране следующее окно:
После запуска этого кода и нажатия кнопки на консоль выводится следующий текст:
3. Кнопки
Теперь, когда мы можем пометить другие компоненты графического интерфейса в приложении — давайте взглянем на первый интерактивный компонент, который мы будем реализовывать — QButton . Кнопки приводят к результатам — в нашем случае их можно использовать для вызова определенных функций. Есть несколько предопределенных кнопок по умолчанию: ОК, Да, Нет, Отмена, Применить и Закрыть , хотя вы также можете добавить на них собственный текст.
Вы можете прикрепить обработчик событий к кнопке, которая запускает функцию или любой другой фрагмент кода при нажатии кнопки. Давайте создадим кнопку, которая позволяет пользователю добавлять QLabel на экран.
Как только пользователь вводит текст в QLineEdit и было обнаружено нажатие кнопки, мы собираем данные из QLineEdit и используем этот текст для установки текста нового QLabel , который затем добавляется в макет.
Поскольку кнопки ожидают, что вызываемая функция будет передана в качестве обработчика события щелчка, мы определим новую функцию add_label() которую можно использовать для добавления любого QLabel в указанный макет:
Теперь давайте напишем наш графический интерфейс и вызовем эту функцию с текстом, предоставленным пользователем:
После того, как мы запустим этот код, мы можем написать текст в QLineEdit , которое добавляется в макет как QLabel когда мы нажимаем на Add Label :
4. Редактирование строк
Мы дважды кратко рассмотрели QLineEdit — давайте посмотрим, что он предлагает. Как было показано ранее, он позволяет пользователям вводить строку текста — это элементарный способ сбора пользовательских данных, будь то для добавления или редактирования уже существующих данных. Конечно, мы можем выполнять обычные операции, такие как копирование , вставка , отмена , повтор, во время написания текста внутри них.
Вот некоторые из распространенных методов, которые вы будете использовать с ними:
- setAlignment() снова выровняет заголовок в соответствии с константами выравнивания
- setMaxLength() устанавливает максимальное количество символов, которое пользователь не может превзойти
- text() — извлекает текст в QLineEdit
- setText() — устанавливает текст в QLineEdit
- clear() сотрет все содержимое QLineEdit
Давайте перепишем предыдущий пример, но на этот раз уже есть некоторый предопределенный текст в QLineEdit , изменим уже существующий QLabel вместо добавления нового — и кратко рассмотрим использование слотов PyQt , которые будут рассмотрены более подробно позже. в руководстве.
Мы создадим простейшее приложение для цитат, в котором есть корпус известных цитат и которое выдает случайные по запросу. Вы можете расширить этот список, добавив новый и нажав Добавить цитату , которая затем будет включена в пул котировок, когда вы решите получить новую случайную цитату с помощью Get Random Quote :
5. Поля со списком
Комбинированные поля позволяют пользователям выбирать из списка опций
- аналогично <select> в HTML. Это может быть достигнуто с помощью виджета QComboBox Базовый QComboBox для чтения, что означает, что пользователь должен выбирать исключительно из предопределенного списка и не может добавлять свои собственные параметры. Однако они также могут быть редактируемыми, что позволяет пользователю добавлять новый параметр, если он не соответствует его потребностям.
Ниже приведены наиболее часто используемые методы класса QComboBox:
- addItem() добавляет строку в коллекцию
- addItems() добавит каждую из строк в данном списке в коллекцию
- Clear() используется для удаления всех элементов в коллекции
- count() используется для получения количества элементов в коллекции
- currentText() используется для получения текста текущего выбранного элемента
- itemText() принимает index и возвращает текст этого элемента
- currentIndex() возвращает индекс текущего выбранного элемента
Давайте создадим мини-приложение для заказа, в котором пользователь выбирает элемент из меню и вводит комментарий для ресторана. Затем при нажатии кнопки пользователю показывается такой порядок:
Теперь разместим заказ и прикрепим к нему запрос:
6. Радиокнопки и флажки
Радиокнопки и флажки в основном используются с той же целью — позволяя кому-то выбрать вариант из нескольких. Единственное отличие состоит в том, что радиобоксы используются, когда мы хотим ограничить пользователя выбором одного варианта, а флажки используются, когда мы хотим разрешить пользователю выбирать несколько опций.
Например, мы можем заставить пользователя выбрать между новым или старым клиентом (не могут быть оба одновременно), но разрешить ему выбрать несколько услуг, на которые они хотели бы подписаться.
QCheckBox , они реализованы как QRadioButton и QCheckBox. Мы можем проверить, отмечены ли они, установить для них отмеченный или снятый флажок, установить их текст, а также получить текст их меток:
- setChecked() проверяет переключатель или флажок
- setText() устанавливает метку, связанную с кнопкой или флажком
- text() получит метку кнопки / флажка
- isChecked() проверяет, выбрана ли кнопка / флажок.
Давайте создадим простое приложение, которое позволяет пользователям выбирать между парой услуг, которые предлагает воображаемая автомойка:
Это подсказывает нам приложение, похожее на опрос, которое позволяет нам выбирать, старый мы или новый клиент, и позволяет нам выбирать между услугами, которые предлагает автомойка:
7. Отображение данных с помощью виджета таблицы
QTableWidget — это виджет, который без особой настройки позволяет нам создавать в PyQt потрясающие таблицы, похожие на Excel, в которых мы можем отображать данные.
Каждая таблица представляет собой таблицу на основе элементов со строками и столбцами.
Имейте в виду, что использование QTableWidget — не единственный способ отображения информации в таблицах. Модели данных также можно создавать и отображать с помощью виджета QTableView Хотя QTableWidget своей сути использует QTableView под капотом для фактического создания таблицы, поэтому мы будем использовать подход более высокого уровня, используя таблицу с самого начала.
Учитывая столбцовую природу таблиц, мы можем удобно создавать словари для хранения данных для них или даже списков списков. При создании таблицы мы захотим установить количество столбцов и строк перед добавлением в нее каких-либо данных, а затем просто заполнить ее циклами:
- setRowCount() устанавливает количество строк
- setColumnCount() устанавливает количество столбцов
- setHorizontalHeaderLabels() устанавливает метки горизонтальных заголовков
Теперь давайте создадим простое приложение, которое содержит таблицу с несколькими северными странами и их столицами:
Запустив этот код, мы увидим на экране следующее окно:
8. Отображение данных с помощью виджета в виде дерева.
Деревянные виджеты действительно полезны для отображения древовидных структур, таких как файловые иерархии или подсписки, относящиеся к определенным спискам элементов. Чтобы приспособиться к этому типу виджетов, PyQt предлагает QTreeWidget .
Подобно тому, как QTableWidget построен поверх QTableView — QTreeWidget построен поверх QTreeView .
Дерево состоит из заголовков и элементов . Заголовки — это имена столбцов. Каждому элементу может быть назначено несколько элементов. Элемент, например, может быть каталогом, в то время как его собственные элементы — это файлы в этом каталоге — или элемент может быть задачей, а его элементы — это люди, назначенные для этой задачи.
Вот некоторые из распространенных методов, которые мы будем использовать для работы с Tree Widgets:
- setHeaderLabels() устанавливает имя столбца для виджета дерева
- clear() чтобы удалить все данные из Дерева
- editItem() для редактирования определенного элемента в дереве
- addTopLevelItem() для добавления элемента верхнего уровня
- addTopLevelItems() для добавления списка элементов верхнего уровня
Каждый элемент может быть назначен родительскому компоненту. Для элемента верхнего уровня мы можем назначить его самому QTreeWidget , а для элементов более низкого уровня — мы можем назначить их уже существующим элементам верхнего уровня. Вы можете пойти в этом направлении настолько далеко, насколько захотите, однако слишком большое количество уровней может сбивать с толку пользователя.
Давайте продолжим и составим быстрый список покупок — с Food и Furniture в качестве предметов верхнего уровня (категории предметов, которые мы хотели бы купить), а их дети будут фактическими предметами сами:
Запустив этот код, мы увидим на экране следующее окно:

Заключение
В этом руководстве мы перешли к PyQt — оболочке Python для популярной библиотеки Qt.
Мы рассмотрели некоторые ключевые концепции библиотеки и приступили к работе с ней через менеджеры компоновки, познакомились с виджетами и создали несколько действительно простых демонстрационных приложений, демонстрирующих, как вы можете их использовать.