Как сделать многостраничное приложение pyqt5

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Python — это высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода, как говорит нам Википедия. А также активно используется для написания Web-приложений. Ну а для работы с Qt для Python была разработана компанией Riverbank Computing библиотека PyQt5, которая является набором "привязок" к библиотеке Qt5.

Из интереса, я решил написать небольшой Hello World с использованием PyQt5.

Установка

Первым делом устанавливаем Python, в моём случае это Python 3.5.2.

Для Windows можно скачать установочный пакет с официального сайта Python . Для Linux можем воспользоваться стандартным менеджером пакетов.

Далее необходимо установить PyQt5. В случае Linux можно либо установить с помощью стандартного менеджера пакетов. Например, для deb-based дистрибутивов:

Либо установить сначала утилиту pip для установки пакетов Python:

И уже произвести установку с помощью данной утилиты, что будет аналогично как для Windows, так и для Linux систем:

Для разработки на Python была выбрана IDE PyCharm.

  1. 1. Установка
  2. 2. Hello World
    1. 1. Полный текст программы
    2. 2. Отличия
      1. 1. if __name__ == "__main__":
      2. 2. Синтаксис сигналов и слотов
      3. 3. Python

      Hello World

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

      Полный текст программы

      Отличия

      if __name__ == "__main__":

      В приложениях на Python часто можно встретить следующую конструкцию:

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

      Синтаксис сигналов и слотов

      В PyQt5 используется следующий синтаксис сигналов и слотов, который показан на примере использования QAction.

      Тогда как в Qt C++ тоже самое выглядело бы следующим образом:

      Python

      Пожалуй, самое очевидное ;-)
      Здесь без комментариев.

      Заключение

      В результате получим программу следующего вида.


      Рекомендуем хостинг TIMEWEB

      Рекомендуем хостинг TIMEWEB

      Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

      Руководство по работе с библиотекой Qt с использованием Python 3

      Установка необходимых компонентов для работы

      Установить Python версии не менее 3.5.

      В операционных система семейства Unix процесс установки сводится к запуску пакетного менеджера с выбором необходимого пакета.

      Пример установки Python 3 в Ubuntu:

      По умолчанию, путь к интерпретатору Python 3 при установке на любой операционной системе добавляется к переменной среды PATH. В Windows для запуска интепретатора достаточно набрать в консоли:

      В Unix системах, как правило, может быть уже установлена более ранняя версия интерпретатора, поэтому для корректного запуска 3-ей ветки Python рекомендуется выполнить в терминале команду:

      В Python установка сторонних библиотек (или пакетов) происходит с помощью пакетного менеджера pip.

      По умолчанию, в Windows при установке самого интерпретатора устанвливается и пакетный менеджер.

      В Unix системах установка пакетного менеджера pip происходит отдельно.

      Пример установки pip в Ubuntu:

      Установка сторонних пакетов (библиотек) сводится к следующей команде в терминале Unix/консоли Windows:

      pip автоматически найдет, скачает и установит необходимый пакет из сети интернет.

      Для установки библиотеки Qt следует выполнить следующую команду:

      Основы работы с Qt

      Библиотека Qt является кросплатформенной и предназначена для написания графических приложений. Она инкапсулирует в себе все основные понятия любой из операционных графических систем: окна, фреймы, модальные диалоги, кнопки, текстовые поля, панели и т.д. Ядро библиотеки и всех ее компонентов написаны на языке программирования C++. Библиотека не является монолитной и разбита на несколько основных модулей, которые содержат классы для работы с графикой, сетью, файлами, аудио/видео, потоками ОС и т.д.

      Пакет PyQt5 является портом для работы с Qt на языке Python. Ввиду этого, пакет наследует основные названия модулей библиотеки и их классов. Однако, в отличие от процесса работы на C++ под Qt, работа на языке Python с использованием пакета PyQt5 избавляет программиста от низкоуровневых особенностей C++ и ускоряет процесс написания программного кода. В пользу PyQt5 стоит сказать, что скорость понимания абстракций графического интерфейса, написанных на языке Python, бывает более высокой, нежели на C++.

      Как правило, процесс ознакомления с PyQt5 тесно связан с чтением документации по тому или иному классу. Однако, стоит заметить, что все описания классов модулей Qt представлены на языке C++. Но такие понятия, как классы, его атрибуты и методы в языке C++ интуитивно легко перекладываются на язык Python. Тем самым, любые описания и примеры использования того или иного атрибута/метода на языке C++ в документации Qt справедливы и для Python, где любые упоминания про указатели и ссылки просто опускаются при работы с PyQt5.

      На данный момент библиотека Qt развивается в двух направлениях: Qt Widgets и Qt Quick. Qt Widgets является фундаментальным и базовым направлением библиотеки. Данный модуль существует с момента сущестования платформы и направлен на создания графических приложений в стиле объектно-ориентированного подхода, где любой компонент интерфейса представлен объектом класса, тем самым организуя весть графический интерфейс пользователя в иерархию объектов. Qt Quick является более современным ответвлением платформы Qt. Данное направление вводит новые высокоуровневые абстракции вроде машины конечного автомата и вносит принципы реактивного программирования. Также, Qt Quick предлагает идею декларативного описания пользовательского интерфейса средствами JavaScript подобного языка QML.

      В данном руководстве описываются базовые принципы работы с Qt Widgets совместно с пакетом PyQt5.

      1. Основной цикл обработки событий

      Приложение Qt построено на основе бесконечного цикла, который обратывает события: события операционной системы, события пользоваля приложения (поведение мыши, использование клавиатуры). Для запуска минимального приложения, следует передать циклу контекст, в котором начнут обрабатываться события. Базовым контекстом является понятие Виджет, которое представлено классом QWidget.

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

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

      Как было сказано, виджет представлен классом QWidget. Для создания виджета следует определить класс-наследник QWidget. В конструкторе класса следует добавить последний аргумент по умолчанию parent и вызвать инструкцию:

      Параметр parent указывает на родительский виджет описываемого. Если описываемый является корневым, parent = None. Стоит сказать, что создание любого другого дочернего виджета, разметки должно просходить с передачей последним аргументом родительского виджета parent. Наиболее часто, родителем оказывается описываемый виджет self.

      Часто, виджетам устанавливают ту или иную разметку, по правилам которой внутри располагаются другие виджеты. Наиболее используемыми классами разметки являются QVBoxLayout (вертикальная разметка) и QHBoxLayout (горизонтальная разметка). Для добавления дочерних виджетов в разметку предназачен метод addWidget(QWidget). Чтобы установить виджету ту или иную разметку используется метод setLayout(QLayout).

      Хорошим стилем считается создание всех дочерних разметок/виджетов описываемого в теле контструктора класса. Как правило, создается приватный метод, например _initUI, и вызывается в конструкторе __init__.

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

      2.1 Текстовая метка: QLabel

      Часто используемые методы:

      1. text() → string: возвращает текст метки.
      2. setText(string): устанавливает текст метки.

      2.2 Текстовое поле: QLineEdit

      Часто используемые методы:

      1. text() → string: возвращает текст поля ввода.
      2. setText(string): устанавливает текст поля ввода.

      2.3 Кнопка: QPushButton

      Часто используемые методы:

      2.4 Многострочное поле ввода: QTextEdit

      Часто используемые методы:

      1. setText(string): устанавливает текст в поле ввода.
      2. toPlainText() → string: возвращает обычный текст.
      3. toHtml() → string: возврашает текст в формате HTML.

      2.5 Слайдер: QSlider

      Часто используемые методы:

      1. setTickInterval(int): устанавливает шаг.
      2. tickInterval() → int: возвращает шаг.
      3. setMinimum(int): устанавливает минимальное значение.
      4. setMaximum(int): устанавливает максимальное значение.

      2.6 Чек-бокс: QCheckBox

      Часто используемые методы:

      3. Взаимодействие с пользователем: введение в сигналы/слоты

      В библиотеке Qt любые из классов, которые являются наследниками класса QObject могут участвовать в механизме сигналов/слотов. Практически все классы Qt являются наследниками QObject, в том числе и виджеты.

      Механизм сигналов/слотов - является базовым понятием в обработке событий. Событиями могут выступать: действия пользователя графического интерфейса, события операционной системы и т.д. Само понятие события в Qt носит название Сигнал. Реакция на сигнал это всегда какая-либо простая функция, которая носит название Слот.

      Как правило, дочерние компоненты описываемого виджета генерируют какие-либо сигналы. Например, сигнал клика по кнопке. Для реакции на данное событие создается метод внтури описываемого виджета. Стоит упомянуть, что сигнал может передавать любую порцию информации: число, строка, список и т.д.. Если сигнал отправляет какие-либо данные, то в методе на реакцию данного сигнала должен передаваться аргумент(ы) для обработки передаваемой информации.

      Пример использования механизма сигналов/слотов:

      Как видно из примера, виджет sld генерирует сигнал valueChanged, информирующий об изменении позиции слайдера. В свою очередь, данный сигнал связан с методом display виджета lcd. В данном случае, valueChanged является сигналом и отсылает значение типа int, а display является методом-сигналом, в который передается значение типа int. Связывание сигнала и слота происходит с помощью метода сигнала connect, который имеется у любого сигнала Qt.

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

      Пример определения слота:

      Чтобы определить слот, который реагирует на сигналы, отправляющие какую-либо информацию, следует лишь добавить аргумент(ы).

      Пример определения слота на сигнал, передающий значение типа int:

      Виджет slider генерирует сигнал valueChanged при изменении слайдера. В свою очередь, данный сигнал связан с слотом/методом _handleChangeSlider, который принимает аргумент value типа int. При любом изменении слайдера вызывается метод _handleChangeSlider, который устанавливает текст метке label на значение ползунка слайдера. Стоит сказать, что метод метки label.setText принимает строковое значение, поэтому значение, отправляемое сигналом, числового типа int явно приводится к строковому типу str.

      В документации библиотеки Qt к тому или иному классу виджета все сигналы находятся в секции Signals. Особое внимание стоит обращать на типы данных, которые возвращают сигналы.

      Руководство по PyQt5 для начинающих

      Программирование и разработка

      PyQt5 — это модуль Python для разработки настольных приложений с графическим интерфейсом пользователя. Он доступен для нескольких платформ, таких как Windows, Mac, Linux, iOS и Android. Python предлагает несколько модулей, которые фактически поддерживают разработку графического интерфейса, например Tkinter, wxPython, PySide2 и другие. Однако PyQt5 использует более 1000 классов; на самом деле PyQt5 — это огромный модуль! Кроме того, PyQt5 включает Qt Designer, конструктор графического пользовательского интерфейса, который еще больше упрощает создание графического интерфейса. Его можно использовать для создания чего угодно, от медиаплееров до веб-браузеров. В этом руководстве мы изучим основы модуля PyQt5.

      Сначала установим PyQt5

      pip install pyqt5

      pip install pyqt5-tools

      ШАГ 1: СОЗДАНИЕ ПУСТОГО ОКНА

      Первый шаг в создании чего-либо — установка пустого окна. Само пустое окно требует нескольких строк кода, так что давайте посмотрим на это.

      from PyQt5 import QtWidgets

      from PyQt5. QtWidgets import QApplication , QMainWindow

      import sys

      from PyQt5 import QtGui

      class window ( QtWidgets. QWidget ) :

      def __init__ ( self ) :

      super ( ) . __init__ ( )

      Задайте геометрию окна с помощью метода setGeometry (), который принимает четыре аргумента — начальную позицию по оси x, начальную позицию по оси y (другими словами, где на экране появляется верхний левый угол), ширину и высоту окна. окно.

      self . setGeometry ( 350 , 100 , 800 , 600 )

      Задайте заголовок окна с помощью метода setWindowTitle ().

      Вы можете установить значок с помощью setWindowIcon (). Обратите внимание, что размер значка должен составлять 64 на 64 пикселя.

      Каждому файлу PyQt5 требуется следующая строка, которая принимает в качестве аргумента sys.argv.

      application = QApplication ( sys . argv )

      Затем создайте экземпляр класса, который мы создали выше.

      Для выхода из окна по нажатию кнопки X нам понадобится sys.exit (application.exec ()).

      Этот код создаст пустое окно. Код в целом будет выглядеть так:

      ШАГ 2: ВВОДНАЯ ПАНЕЛЬ

      Далее давайте создадим панель ввода. Панель ввода — это место, где пользователи могут добавлять текст, который мы можем извлечь. Полосы ввода создаются с помощью QWidgets.QLineEdit (). Очевидно, мы задаем его геометрию с помощью метода setGeometry ().

      def initUI ( self ) :

      self . input_bar = QtWidgets. QLineEdit ( self )

      self . input_bar . setGeometry ( 150 , 250 , 500 , 40 )

      Имейте в виду; вам все равно нужно активировать функцию в методе __init__ следующим образом:

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

      ШАГ 3: СОЗДАНИЕ КНОПОК

      Теперь давайте добавим несколько кнопок на пустой холст. Итак, напишем код для кнопки. Для кнопки мы используем QtWidgets.QPushButton (). Как обычно, мы можем задать его геометрию с помощью метода setGeometry ().

      Установите значок с помощью метода setIcon ().

      Установите стиль текста с помощью метода setStyleSheet (). Вы можете, среди прочего, изменить цвет, толщину и размер шрифта.

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

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

      def button_clicked ( self ) :
      url_value = self . input_bar . text ( )

      print ( url_value )

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

      ШАГ 4: СОЗДАНИЕ ЯРЛЫКОВ

      Теперь давайте изменим команду нажатия кнопки с помощью QLabels. QLabels используются для добавления текста. Мы добавляем это в def initUI (self).

      Устанавливаем текст на этикетке с помощью метода setText ().

      Мы устанавливаем шрифт, размер и вес с помощью setStyleSheet (). Мы устанавливаем шрифт, размер и вес с помощью setStyleSheet ().

      И, наконец, обновляем все с помощью метода update ().

      Это создает следующее:

      Теперь мы можем изменить содержимое в функции button_clicked ().

      Мы можем получить то, что пользователь пишет в текстовой строке, используя метод text ().

      Затем мы можем изменить метку при нажатии кнопки с помощью метода setText () и разместить их в нужном месте с помощью метода setGeometry ().

      self . label . setText ( url_value )

      self . label . setGeometry ( QtCore. QRect ( 200 , 80 , 500 , 100 ) )

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

      ШАГ 5: QVBOXLAYOUT И QHBOXLAYOUT

      Я не не т добавлять к QVBoxLayout или QHBoxLayout здесь, но вы можете, если вы хотите. QHBoxLayout расположит все по горизонтали, а QVBoxLayout расположит по вертикали. Если вы используете QHBoxLayout или QVBoxLayout, вы должны опустить метод setGeometry ().

      Если бы вы хотели добавить его, вы бы написали следующее в def initUI (self). Сначала вы инициализируете макет с помощью QVBoxLayout ():

      Затем вы добавляете в него нужные виджеты с помощью метода addWidget ().

      self . design . addWidget ( self . label )

      self . design . addWidget ( self . input_bar )

      self . design . addWidget ( self . button1 )

      Вы устанавливаете макет с помощью setLayout (), который принимает инициализированную переменную в качестве аргумента.

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

      application = QApplication(sys.argv)

      ШАГ 6: ДИЗАЙНЕР QT

      Что еще лучше с PyQt5, так это то, что он поставляется со своим собственным дизайнером. Дизайнер — это консоль, на которой вы можете создать желаемый графический интерфейс, а программа выбрасывает для него код Python. Qt Designer поставляется в пакете pyqt5-tools, поэтому его необходимо установить, чтобы он работал. В конструкторе Qt вы можете размещать кнопки, ползунки и т.д. После того, как вы разместите их, вы можете сохранить файл как файл.ui.

      После того, как файл сохранен как файл.ui, вам все равно нужно

      После того, как файл сохранен как файл.ui, вам все равно нужно преобразовать его в файл.py, чтобы PyCharm мог его отобразить. Для этого откройте терминал или cmd и введите:

      Я сохранил свой файл как saved_file_name.ui. Терминал выдаст файл python и назовет его так, как вы просили. Затем вы можете открыть файл.py в PyCharm и добавить к нему логику.

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

      В этом руководстве мы узнали об основах PyQt5 и о том, как использовать конструктор Qt. Мы узнали, что можем создавать пустые экраны, добавлять кнопки с помощью QPushButton, добавлять панели ввода с помощью QLineEdit, добавлять текст с помощью QLabels и упорядочивать все с помощью QVBoxLayout / QHBoxLayout. Фактически, PyQt5 — это очень большой модуль, используемый для создания множества настольных приложений с графическим интерфейсом пользователя. Хотя в python есть много модулей для приложений с графическим интерфейсом, большинство людей выбирают PyQt5, потому что он предлагает огромный выбор дизайнов и дизайнера для облегчения задач. Действительно, PyQt5 стоит изучить!

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

      Установка

      Для работы нам понадобится библиотека для питона pyqt5 и Qt Creator. Как и большинство библиотек в Питоне, проще всего их ставить через имеющийся pip. Открываем командную строку (или PowerShell) с правами администратора и вводим

      pip install pyqt5

      Скриншот PowerShell

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

      Скриншот скачивания Qt Creator

      Далее "Desktop & Mobile applications"

      Скриншот скачивания Qt Creator

      Скриншот скачивания Qt Creator

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


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

      Установка QtCreator

      Создание простого интерфейса в QtCreator

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

      Проектирование интерфейса PyQt

      Проектирование интерфейса PyQt

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

      Проектирование интерфейса PyQt

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

      Проектирование интерфейса PyQt

      Переходим в папку с проектом и копируем файл mainwindow.ui в папку Scripts, которая находится в папке с Python'ом, и вводим след. команду

      ./pyuic5.exe mainwindow.ui -o gui.py

      Файлы интерфейса PyQt

      Код запуска интерфейса PyQt

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

      Скриншот интерфейса PyQt

      Работает :) Но пока это просто интерфейс, давайте придадим ему жизни, добавив событие на кнопку.

      Читайте также: