О себе Реферат Научные труды Индивидуальный раздел
Назад в библиотеку

Особенности взаимодействия Python и PyQt

Нижневартовский государственный университет

Источник: XXVI Всероссийская студенческая научно-практическая конференция Нижневартовского государственного университета: сборник материалов — 2024. — Нижневартовск: НВГУ, 2024. — С. 324–329.

В данной статье рассматривается взаимодействие языка программирования Python с библиотекой для создания GUI (Graphic User Interface) — PyQt.

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

Одним из самых известных модулей для написания GUI на Python является библиотека Tkinter. Основное преимущество Tkinter — ненужность установки (он уже включён в стандартные библиотеки) и интуитивная логика использования [[2], c. 1]. Он хорошо справляется со своей основной задачей — разработкой простого GUI для удобного взаимодействия пользователей с программой. Минусами же являются не самый красивый (по мнению большинства) интерфейс и трудности в определении источника ошибок в некоторых случаях.

Вторым из способов создания GUI является библиотека Eel. В данном случае всё очень просто: библиотека позволяет запускать HTML файлы как отдельные приложения. То есть весь GUI и его оформление будет зависеть от знания программистом HTML, а его внешний вид от привязанных к приложению CSS файлов. Но когда весь GUI основан на HTML, это одновременно является и плюсом, и минусом, в зависимости от навыков и целей программиста [[3], c. 2].

Третьим и наиболее популярным способом является PyQt (https://doc.qt.io/qtforpython-6/). Одно из главных его преимуществ — отдельная среда разработки QtDesigner, в которой можно удобным способом создать шаблон GUI, который позже будет считываться программой и получать свою логику работы. Это значительно упрощает разработку, так как программист может сразу видеть получаемый результат, контролировать местонахождение, размеры и свойства каждого из элементов.

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

Третий плюс PyQt — обширность. Сама библиотека предоставляет множество разных готовых элементов, которые можно использовать, начиная со стандартных кнопок и чекбоксов, заканчивая календарём.

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

И, под конец, PyQt является реализацией Qt — кроссплатформенного фреймворка [[1], с. 2]. Это означает, что любой GUI, написанный на Qt, можно перенести на множество других языков, которые тоже его поддерживают. Как пример, Qt5 поддерживают следующие языки: С++, C#, C, Crystal, Haskell, Python, Java, JavaScript, Ruby, Ring, Rust и другие.

Теперь, когда мы разобрали самые популярные способы создания GUI на Python, рассмотрим реализацию GUI с помощью PyQt двумя различными способами: без QtDesigner, то есть используя только чистый код, и с ним. Для примера реализуем этими способами приложение, которое будет находить нам количество вхождений подстроки в строку, или местоположение первого вхождения, в зависимости от выбранных настроек.

Для обоих вариантов в начале потребуется установить саму библиотеку. Делается это следующим образом:

  1. Нажимаем «WIN + R», что откроет окно «Выполнить»;
  2. Вводим в открывшееся окно «cmd», что откроет окно консоли Windows;
  3. В консоли вводим «pip install PyQt5», после чего начнётся установка библиотеки.

Если в консоли появилось сообщение «pip wasn't found», следует добавить место, в которое был установлен Python, в PATH, а после перезагрузить компьютер и повторить перечисленные действия.

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

В качестве обязательных импортов выступает стандартная библиотека «sys» и «PyQt5.QtWidgets.QWidget». Остальные импорты зависят от реализуемого интерфейса.

После создаётся функция «except_hook()», которая будет помогать нам разбираться в возникающих ошибках внутри программы.

Следующим пунктом является создание классов для основного окна программы и виджетов, которые будут использоваться в ней за счёт классов «QMainWindow» и «QWidget» соответственно. Но так в данном приложении весь интерфейс поместится на одной странице, главное окно нам заменит обычный виджет.

Создадим класс «MainWindow», унаследованный от «QWidget», и переопределим функцию его создания(«__init__(self)»). Для сохранения наследования, надо обязательно прописать «super().__init__()», желательно сделать это в самом начале, чтобы избежать ошибок в будущем. После создадим функцию «initUI(self)», в которой и будем проводить всю работу с созданием GUI и определением аргументов для него, и добавим её в конец функции создания элемента класса. Чтобы «initUI(self)» не вызывала ошибки, пропишем «pass» в теле функции.

После этого идёт основной код программы, в котором мы будем создавать элементы написанного нами класса и показывать их. Для этого в начале создадим условие «if __name__ == '__main__':», что позволит программе работать только в случае, если этот файл будет основным.

В теле условия создадим объект класса «QApplication», который в качестве аргументов инициализации будет принимать системные аргументы «sys.argv». Без этого объекта программа не будет работать, так как он отвечает за цикл, в котором будет производится работа GUI. В случае его отсутствия, программа не будет отображаться.

После чего создадим экземпляр созданного нами класса «MainWindow», используем его наследованную функцию «show()», заменим «sys.excepthook()» созданной нами функцией «except_hook()», а после установим условием завершения работы программы завершение работы цикла GUI. В итоге получится код, представленный на рисунке 1.

Рис. 1. Базовый код для реализации приложения на PyQt

После этого в вариантах реализации начинаются различия. Для начала разберём вариант с использованием чистого кода, чтобы после посмотреть, насколько проще будет вариант со специализированной средой разработки.

Для этого в классе «MainWindow» надо добавить все используемые элементы в качестве аргументов элемента класса, распределить их местоположение в GUI, а после описать логику работы программы.

Среди используемых элементов у нас будут следующие классы:

  1. QLabel — отображаемый текст;
  2. QLineEdit — строка для вводимого текста;
  3. QPlainTextEdit — большое поле для вводимого текста;
  4. QRadioButton — радиокнопка, которая будет осуществлять переключение режимов;
  5. QPushButton — нажимная кнопка, при активации которой мы будем выполнять какую-либо функцию;
  6. QVBoxLayout, QHBoxLayout — специальные классы, которые упростят размещение элементов программы в GUI и помогут реализовать их динамическое изменение в зависимости от размеров окна и прочих параметров.

Каждый из этих классов будет необходимо импортировать, чтобы использовать в программе. После добавить их как аргументы нашего класса, чтобы после мы могли к ним обращаться. Добавление аргументов лучше всего осуществлять в функции («__init__(self)»), а всю остальную работу с ними провести в функции «initUI(self)». Делается это для логического разделения кода программы.

Для реализации инструментария программы нам понадобятся 4 элемента «QLabel», «QLineEdit», «QPlainTextEdit», 2 элемента «QRadioButton», «QPushButton», «QHBoxLayuot» и «QVBoxLayout». Для каждого из элементов в момент создания экземпляра класса можно записать нужный для элемента текст в конструктор.

После создания и добавления как аргументов основного объекта, метод «__init__(self)» будет выглядеть так, как показано на рис. 2.

Рис. 2. Метод «__init__(self)»

После нужно написать тело метода «initUI». В нём установим название, под которым будет отображаться наше приложение, и минимальный размер окна приложания за счёт методов «self.setWindowTitle(Title)» и «self.setMinimumSize(minSizeX, minSizeY)» соответственно.

Следующим шагом нужно распределить все элементы в гланый Layout, а после установить его для окна нашего элемента класса. Делается это за счёт методов «addWidget(Widget)» и «addLayout(Layout)» классов «QVBoxLayout» и «QHBoxLayuot».

Также добавим пару строк кода, которые после понадобятся нам для реализации логики работы нашего приложения. Подключим метод «search()» (который нам ещё надо будет написать) как функцию, которая будет срабатывать в момент нажатия на наш экземпляр класса «QPushButton» за счёт следующей строчки кода: «self.searchButton.clicked.connect(self.search)». В данной строчке «self.searchButton» — экземпляр класса кнопки, «clicked» — действие, при котором будет срабатывать функция, которую мы хотим подключить, а «connect» — метод для подключения функции.

И для предотвращения ошибок сразу же включим один из экземпляров «QRadioButton» методом «setChecked(State)».

После выполнения данных действий, метод «initUI» будет выглядеть так, как показано на рисунке 3.

Рис. 3. Метод «initUI(self)»

Под конец осталось реализовать логику работы программы, заключённую в методе «search(self)» нашего класса, и программа будет готова.

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

В первую очередь для этого нам потребуется скачать приложение «Qt Designer». После, необходимо создать базовый шаблон для «QWidget» в начальном меню и добавить в него все необходимые элементы из «панели виджетов», которая по умолчанию находится слева. После, за счёт «редактора свойств», который по умолчанию находится справа, нужно изменить имена всех элементов (параметр «objectName») на те, которые мы используем в программе, и отредактировать все остальные свойства, такие как текст «QLabel» и др.

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

Для подключения шаблона используется функция «PyQt.uic.loadUi(UILocation, Widget)», которую перед этим надо будет импортировать. После подключения шаблона, код класса станет выглядеть так, как показано на рисунке 4.

Рис. 4. Код класса «MainWindow» при реализации при помощи «Qt Designer», без функции «search()»

Заключение

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

Литература

  1. Киселева, Е. А. Обзор GUI Framework на языке программирования Python // Постулат. 2020. № 1(51). С. 135.
  2. Мукминов, Д. В. Создание GUI приложений на языке программирования Python // Приоритетные направления инновационной деятельности в промышленности: сборник научных статей VI международной научной конференции (Казань, 29-30 июня 2021 года). Казань: Общество с ограниченной ответственностью «КОНВЕРТ», 2021. С. 133-135.
  3. Радионов, С. В. Создание интерфейса для программы python3 с помощью библиотеки // Постулат. 2020. № 8(58). С. 14.