Шаг 3.
Библиотека PyQt5.
Знакомство с PyQt5. Структура PyQt-программы

    На этом шаге мы построчно прокомментируем приведенную на предыдущем шаге программу.

    Запускать программу мы научились. Теперь рассмотрим код программы из предыдущего шага построчно.

    В первой строке указывается кодировка файла. Поскольку в Python 3 по умолчанию для сохранения исходного кода используется кодировка UTF-8, эту строку можно и не указывать. Во второй строке подключается модуль QtWidgets - он содержит классы, реализующие компоненты графического интерфейса: окна, надписи, кнопки, текстовые поля и др. В третьей строке производится подключение модуля sys, из которого нам потребуется список параметров, переданных в командной строке (argv), а также функция exit(), позволяющая завершить выполнение программы.

    Выражение:

  арр = QtWidgets.QApplication(sys.argv)
создает объект приложения в виде экземпляра класса QApplication. Конструктор этого класса принимает список параметров, переданных в командной строке. Следует помнить, что в программе всегда должен быть объект приложения, причем обязательно только один. Может показаться, что после создания объекта он в программе больше нигде не используется, однако надо понимать, что с его помощью осуществляется управление приложением незаметно для нас. Получить доступ к этому объекту из любого места в программе можно через атрибут qApp из модуля QtWidgets. Например, вывести список параметров, переданных в командной строке, можно так:
  print (QtWidgets.qApp.argv()) 

    Следующее выражение:

  window = Qtwidgets.QWidget()
создает объект окна в виде экземпляра класса QWidget. Этот класс наследуют практически все классы, реализующие компоненты графического интерфейса. И любой компонент, не имеющий родителя, обладает своим собственным окном.

    Выражение:

  window.setWindowTitle("Первая программа на PyQt")
задает текст, который будет выводиться в заголовке окна, для чего используется метод setWindowTitle().

    Очередное выражение:

  window.resize(300, 70)
задает минимальные размеры окна. В первом параметре метода resize() указывается ширина окна, а во втором параметре - его высота. При этом надо учитывать, что метод resize() указывает размеры не самого окна, а его клиентской области, - размеры заголовка и ширина границ окна не учитываются. Также следует помнить, что эти размеры являются рекомендацией, - то есть, если компоненты не помещаются в окне, оно будет увеличено.

    Выражение:

  label = QtWidgets.QLabel ("<center>Привет, мир!</center>")
создает объект надписи. Текст надписи задается в качестве параметра в конструкторе класса QLabel. Обратите внимание, что внутри строки мы указали HTML-теги, - а именно: с помощью тега <center> произвели выравнивание текста по центру компонента. Возможность использования HTML-тегов и CSS-атрибутов является отличительной чертой библиотеки PyQt - например, внутри надписи можно вывести таблицу или отобразить изображение. Это очень удобно.

    Следующее выражение:

  btnQuit = QtWidgets.QPushButton("&Закрыть окно")
создает объект кнопки. Текст, который будет отображен на кнопке, задается в качестве параметра в конструкторе класса QPushButton. Обратите внимание на символ & перед буквой З - таким образом задаются клавиши быстрого доступа. Если нажать одновременно клавишу Alt и клавишу с буквой, перед которой в строке указан символ &, то кнопка сработает.

    Выражение:

  vbox = QtWidgets.QVBoxLayout()
создает вертикальный контейнер. Все компоненты, добавляемые в этот контейнер, будут располагаться по вертикали сверху вниз в порядке добавления. Внутри контейнера автоматически производится подгонка размеров добавляемых компонентов под размеры контейнера. При изменении размеров контейнера будет произведено изменение размеров всех компонентов.

    В следующих двух выражениях:

  vbox.addWidget(label)
  vbox.addWidget(btnQuit)
с помощью метода addWidget() производится добавление созданных ранее объектов надписи и кнопки в вертикальный контейнер. Так как объект надписи добавляется первым, он будет расположен над кнопкой. При добавлении компонентов в контейнер они автоматически становятся потомками контейнера.

    Новое выражение:

  window.setLayout(vbox)
добавляет контейнер в основное окно с помощью метода setLayout(). Таким образом, контейнер становится потомком основного окна.

    Выражение:

  btnQuit.clicked.connect(app.quit)
назначает обработчик сигнала clicked() кнопки, который генерируется при ее нажатии. Этот сигнал доступен через одноименный атрибут класса кнопки и поддерживает метод connect(), который и назначает для него обработчик, переданный первым параметром метода. Обработчик представляет собой метод quit() объекта приложения, выполняющий немедленное завершение его работы. Такой метод принято называть слотом.


   Пояснение. Сигналом в PyQt называется особое уведомление, генерируемое при наступлении какого-либо события в приложении: нажатия кнопки, ввода символа в текстовое поле, закрытия окна и пр.

    Очередное выражение:

  window.show()
выводит на экран окно и все компоненты, которые мы ранее в него добавили.

    И, наконец, последнее выражение:

  sys.exit(app.ехес_())
запускает бесконечный цикл обработки событий в приложении.

    Код, расположенный после вызова метода ехес_(), будет выполнен только после завершения работы приложения, - поскольку результат выполнения метода ехес_() мы передаем функции exit(), дальнейшее выполнение программы будет прекращено, а код возврата передан операционной системе.

    На следующем шаге мы рассмотрим ООП-стиль создания окна.




Предыдущий шаг Содержание Следующий шаг