Python PyQt5: современные графические интерфейсы для Windows, MacOS и Linux

Python регулярно включают в разнообразные рейтинги лучших языков программирования благодаря большому сообществу и легко читаемому синтаксису. Более того, Python под силу создать современный графический пользовательский интерфейс  —  GUI  —  для обычных скриптов. В руководстве уделим внимание модулю для разработки GUI PyQt5, но стоит также упомянуть аналоги: Tkinter и WxWidget.

Статья подойдет в том числе и начинающим программистам, поэтому, не теряя времени, приступаем!

Содержание руководства:

  1. Установка и настройка PyQt5.
  2. Основы PyQt5.
  3. Заголовок окна.
  4. События и кнопки.
  5. Поля ввода.
  6. Окна сообщений и всплывающие окна.
  7. Выводы.

1. Установка и настройка PyQt5

Скачайте и установите последнюю версию Python для вашей системы, а если Python уже на месте, то установите пакеты при помощи следующей команды (откройте командную строку, введите и нажмите Enter):

pip install pyqt5

2. Основы PyQt5

Теперь на вашем компьютере сохранен пакет PyQt5, поэтому давайте начнем с написания первого окна графического интерфейса. Откройте ваш любимый текстовый редактор или IDE и выполните приведенный ниже код:

# Построение Windows GUI

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel

def main():
    app = QApplication(sys.argv)
    win = QMainWindow()
    win.setGeometry(400,400,400,300)
    win.setWindowTitle("Pyqt5 Tutorial")
    win.show()
    sys.exit(app.exec_())
    
main()

Результат выполнения программы:

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

  • QMainWindow()  —  словно контейнер, содержащий все виджеты, такие как кнопки, текст, поле ввода и т. д.
  • SetGeometry()  —  один из методов QMainWindow(), устанавливает размер окна. Синтаксис: setGeometry(x, y, длина, ширина).
  • SetWindowTitle()  —  устанавливает заголовок окна.
  • Win.show()  —  создает и отображает весь разработанный интерфейс.
  • Sys.exit(app.exec_())  —  устанавливает, что конкретное окно не закроется без нажатия на кнопку с крестиком. Без этой строчки кода GUI-программа завершится через секунду после выполнения.

3. Заголовок окна

Label Text  —  это текст, отображаемый внутри окна. С написанием Label Text в PyQt5 вам поможет виджет Qlabel

Выполните следующий код:

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel

def main():
    app = QApplication(sys.argv)
    win = QMainWindow()
    win.setGeometry(400,400,400,300)
    win.setWindowTitle("Pyqt5 Tutorial")

#Label Text
    label= QLabel(win)
    label.setText("Hi this is Pyqt5")
    label.move(100,100)

win.show()
    sys.exit(app.exec_())

main()

Результат выполнения программы:

Если кратко, то вызываем метод Qlabel() и передаем в него переменную QMainWindow.

  • Метод SetText() устанавливает Label Text, в качестве аргумента принимает только строковые данные.
  • Метод Move(x, y) применяется для установки положения Label Text внутри окна.

4. События и кнопки

Кнопки  —  важная часть любого программного обеспечения, ведь именно кнопка определяет действие пользователя, а следовательно, и результат работы программы тоже. Для создания кнопок в PyQt5 придётся применить другой виджет под названием QtWidgets, выполните следующий код:

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel

def main():
    app = QApplication(sys.argv)
    win = QMainWindow()
    win.setGeometry(400,400,400,300)
    win.setWindowTitle("Pyqt5 Tutorial")

#Button
    button = QtWidgets.QPushButton(win)
    button.setText("Hi! Click Me")
    button.move(100,100)

win.show()
    sys.exit(app.exec_())

main()

Результат выполнения программы:

В коде вышеизложенного примера переменная QMainWindow передается в метод из Qwidget под названием QPushbutton. Далее разберем код примера по пунктам.

  • SetText() устанавливает название для кнопки, как можно увидеть на приведенном выше изображении.
  • Move() снова применяется для установки положения кнопки в окне по координатам на осях x и y.

Теперь пришел черед событийно-ориентированного программирования (Event-Driven-Programming)! Проще говоря, нужно определить действие для кнопки, то есть, если пользователь на нее нажмет, то что-то должно произойти. Ознакомьтесь со следующим кодом, а дальше рассмотрим подробные объяснения:

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel

def click():
    print("Hy Button is clicked!")

def main():
    app = QApplication(sys.argv)
    win = QMainWindow()
    win.setGeometry(400,400,400,300)
    win.setWindowTitle("Pyqt5 Tutorial")

#Button Click
    button = QtWidgets.QPushButton(win)
    button.setText("Hi! Click Me")
    button.move(100,100)
    button.clicked.connect(click)

win.show()
    sys.exit(app.exec_())

main()

Теперь в примере определяется не только главная функция по имени main(), но и функция по имени click(), передающаяся в качестве параметра для button.clicked.connect() в main(). Таким образом указывается конкретная функция, срабатывающая при нажатии на конкретную кнопку.

Запустив такой код и нажав на кнопку, вы увидите вывод на экране консоли. Дело за вами, что же написать внутри функции click()! Протестируйте код на вашей операционной системе.


5. Поля ввода

Поля ввода также называются текстовыми полями  —  это области для пользовательского ввода информации. Для объявления поля ввода в PyQt5 применяется специальный виджет QlineEdit(), а в него, как обычно, передается в качестве параметра QMainWindow

Посмотрите на следующий код и обратите внимание на его результат:

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel

def main():
    app = QApplication(sys.argv)
    win = QMainWindow()
    win.setGeometry(400,400,400,300)
    win.setWindowTitle("Pyqt5 Tutorial")

#Entry Box / Text Box
    textbox = QtWidgets.QLineEdit(win)
    textbox.move(100, 100)
    textbox.resize(180,40)

win.show()
    sys.exit(app.exec_())

main()

Результат выполнения программы:

  • Resize(width, height) изменяет размер виджета поля ввода.

6. Окна сообщений и всплывающие окна

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

Для создания окон сообщений в PyQt5 применяется виджет QMessageBox, он опять таки принимает QMainWindow в качестве параметра. 

Проанализируйте следующий код:

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel

def main():
    app = QApplication(sys.argv)
    win = QMainWindow()
    win.setGeometry(400,400,400,300)
    win.setWindowTitle("Pyqt5 Tutorial")

#Message Box
    msg = QtWidgets.QMessageBox(win)
    msg.setWindowTitle("Pyqt5 Alert")
    msg.setText("Message box in Pyqt5!")
    msg.exec_()

win.show()
    sys.exit(app.exec_())

main()

Результат выполнения программы:

  • SetWindowTitle() устанавливает заголовок для окна сообщения.

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

msg = QtWidgets.QMessageBox(win)
msg.setWindowTitle("Pyqt5 Alert")
msg.setText("Message box in Pyqt5!")
msg.setIcon(QtWidgets.QMessageBox.Critical)
msg.exec_()

Результат выполнения программы:

Ниже приведен список допустимых для окон сообщений значков:

  • QMessageBox.Warning
  • QMessageBox.Critical
  • QMessageBox.Information
  • QMessageBox.Question

Выводы

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

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

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Haider Imtiaz: Build Modern GUI in Python using PyQt5 Framework

Предыдущая статьяКак создать приложение на Go с gRPC
Следующая статьяРекомендации по обработке и регистрации ошибок в React