PyQt5: первые программы

Я начинаю перевод серии уроков PyQt5 от zetcode.
PyQt5 — это набор Python библиотек для создания графического интерфейса на базе платформы Qt5 от компании Digia.
Он доступен для Python 2.x и 3.x. Этот учебник использует Python 3.
Библиотека Qt является одной из самых мощных библиотек GUI (графического интерфейса пользователя).
Установить PyQt5 на Windows можно с официального сайта библиотеки.
Установить PyQt5 на linux-системы можно с помощью любого менеджера пакетов:
sudo apt-get install python3-pyqt5 pyqt5-dev-tools
PyQt5 реализован в виде набора python-модулей. Эта библиотека имеет более 620 классов и 6000 функций и методов.
Это мультиплатформенная библиотека, которая работает на всех основных операционных системах, в том числе Unix, Windows и Mac OS.
Простой пример
Это простой пример, показывающий небольшое окно. Тем не менее, мы можем многое сделать с этим окном. Мы можем изменить его размер, развернуть его или свернуть. Это требует написания значительного объёма кода. Однако кто-то уже запрограммировал эту функциональность до нас. Поскольку эта функциональность повторяется в большинстве приложений, нет необходимости писать её снова.
PyQt5 является инструментом высокого уровня. Если бы мы писали это на более низком уровне, следующий пример кода легко мог бы растянуться на сотни строк:
Приведенный выше код показывает небольшое окно на экране.
Здесь мы делаем необходимые импорты. Основные виджеты расположены в PyQt5.QtWidgets.
Каждое приложение PyQt5 должно создать объект приложения (экземпляр QApplication). Параметр sys.argv это список аргументов командной строки. Скрипты Python можно запускать из командной строки. Это способ, которым мы можем контролировать запуск наших сценариев.
Виджет QWidget это базовый класс для всех объектов интерфейса пользователя в PyQt5. Мы предоставляем конструктор по умолчанию для QWidget. Конструктор по умолчанию не имеет родителя. Виджет без родителей называется окно.
Метод resize() изменяет размеры виджета. Он стал 250 пикселей в ширину и 150 в высоту.
Метод move() двигает виджет на экране на координату x=300, y=300.
Здесь мы задаём заголовок нашего окна.
Метод show() отображает виджет на экране. Виджет сначала создаётся в памяти, и только потом (с помощью метода show) показывается на экране.
Наконец, мы попадаем в основной цикл приложения. Обработка событий начинается с этой точки. Основной цикл получает события от оконной системы и распределяет их по виджетам приложения. Основной цикл заканчивается, если мы вызываем метод exit() или главный виджет уничтожен. Метод sys.exit() гарантирует чистый выход. Вы будете проинформированы, как завершилось приложение.
Метод exec_ () имеет подчеркивание. Это происходит потому, что exec является ключевым словом в python 2.
Значок приложения
Значок приложения — небольшое изображение, которое обычно отображается в верхнем левом углу заголовка. В следующем примере мы покажем, как сделать это в PyQt5. Мы также представим некоторые новые методы.
Не забудьте также скачать какую-нибудь иконку 🙂
Предыдущий пример был написан в процедурном стиле. Язык программирования Python поддерживает как процедурный, так и объектно-ориентированный стили программирования. Программирование в PyQt5 означает программирование в ООП.
Три важные вещи в объектно-ориентированном программировании это классы, данные и методы. Здесь мы создаем новый класс Example. Класс Example наследуется от класса QWidget. Это означает, что мы вызываем два конструктора: первый для класса Example и второй для родительского класса. Функция super() возвращает родительский объект Example с классом, и мы вызываем его конструктор.
Создание GUI делегируется методу initUI().
Все три метода были унаследованы от класса QWidget.
Метод setGeometry() делает две вещи: помещает окно на экране и устанавливает его размер. Первые два параметра х и у — это позиция окна. Третий — ширина, и четвертый — высота окна. На самом деле, он сочетает в себе методы resize() и move() в одном методе.
Последний метод устанавливает иконку приложения. Чтобы сделать это, мы создали объект QIcon. QIcon получает путь к нашей иконке для отображения.
Создаются объекты application и Example. Запускается основной цикл.
Подсказки
Мы можем предоставить всплывающую подсказку для любого из виджетов.
QWidget widget'QPushButton widget'В этом примере мы покажем подсказку для двух виджетов PyQt5.
Этот статический метод устанавливает шрифт, используемый для отображения подсказки. Мы используем шрифт 10px SansSerif.
QWidget widget'Чтобы создать всплывающую подсказку, мы вызываем метод setToolTip(). Мы можем использовать форматирование текста.
QPushButton widget'Мы создаем виджет кнопки и устанавливаем подсказку для него.
Меняем размер кнопки и перемещаем относительно окна. Метод sizeHint() дает рекомендуемый размер для кнопки.
Закрытие окна
Очевидный способ закрыть окно, это нажать на крестик. В следующем примере мы покажем, как мы можем программно закрыть наше окно. Мы кратко рассмотрим сигналы и слоты.
В этом примере, мы создаем кнопку выхода. После нажатия на кнопку, приложение завершается.
Мы создаем кнопку. Кнопка является экземпляром класса QPushButton. Первый параметр конструктора - название кнопки. Вторым параметром является родительский виджет. Родительский виджет является виджетом Example, который наследуется от QWidget.
Система обработки событий в PyQt5 построена на механизме сигналов и слотов. Если мы нажмем на кнопку, вызовется сигнал "нажатие". Слот может быть слот Qt или любая Python функция.
QCoreApplication содержит главный цикл обработки; он обрабатывает и диспетчеризирует все события. Метод instance() дает нам его текущий экземпляр.
Обратите внимание, что QCoreApplication создается с QApplication. Сигнал «нажатие» подключен к методу quit(), который завершает приложение. Коммуникация осуществляется между двумя объектами: отправителя и приемника. Отправитель кнопка, приемник — объект приложения.
Message Box
По умолчанию, если мы нажмем на крестик, QWidget закрывается. Иногда мы хотим изменить это поведение по умолчанию, например, если у нас есть открытый файл, в котором мы сделали некоторые изменения. Мы показываем окно с сообщением для подтверждения действия.
Если мы закрываем QWidget, генерируется QCloseEvent. Чтобы изменить поведение виджета, нам нужно переопределить обработчик события closeEvent().
Мы показываем окно с сообщением и с двумя кнопками: Yes и No. Первая строка отображается в заголовке окна. Вторая строка является текстовым сообщением и отображается в диалоговом окне. Третий аргумент определяет комбинацию кнопок, появляющихся в диалоге. Последний параметр - кнопка по умолчанию. Это кнопка, на которой изначально установлен фокус клавиатуры. Возвращаемое значение хранится в переменной reply.
Здесь мы проверяем возвращаемое значение. Если мы нажмем на кнопку Yes, мы принимаем событие, которое приводит к закрытию виджета и приложения. В противном случае мы будем игнорировать событие закрытия.
Центрирование окна на экране
Следующий скрипт показывает, как мы можем центрировать окно на рабочем столе.
Класс QtWidgets.QDesktopWidget предоставляет информацию о компьютере пользователя, в том числе о размерах экрана.
Код, который будет центрировать окно, находится в нами созданном методе center().
Мы получаем прямоугольник, определяющий геометрию главного окна. Это включает в себя любые рамки окна.
Мы получаем разрешение экрана нашего монитора. И с этим разрешением, мы получаем центральную точку.
Наш прямоугольник уже имеет ширину и высоту. Теперь мы установили центр прямоугольника в центре экрана. Размер прямоугольника не изменяется.
Мы двигаем верхний левый угол окна приложения в верхний левый угол прямоугольника qr, таким образом, центрируя окно на нашем экране.
В этой части урока PyQt5 мы рассмотрели некоторые основы.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Qapplication python что делает
На этом шаге мы рассмотрим особенности управления этим циклом .
Для взаимодействия с системой и обработки возникающих сигналов предназначен основной цикл приложения. После вызова метода ехес_() программа переходит в бесконечный цикл. Инструкции, расположенные после вызова этого метода, будут выполнены только после завершения работы всего приложения. Цикл автоматически прерывается после закрытия последнего открытого окна приложения. С помощью статического метода setQuitOnLastWindowClosed() из класса QApplication это поведение можно изменить.
Чтобы завершить работу приложения, необходимо вызвать слот quit() или метод exit([returnCode=0]) класса QApplication . Поскольку программа находится внутри цикла, то вызвать эти методы можно лишь при наступлении какого-либо события, - например, при нажатии пользователем кнопки.
После возникновения любого сигнала основной цикл прерывается, и управление передается в обработчик этого сигнала. После завершения работы обработчика управление опять передается основному циклу приложения.
Если внутри обработчика выполняется длительная операция, то программа перестает реагировать на события. В качестве примера изобразим длительный процесс с помощью функции sleep() из модуля time .
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys, time def on_clicked(): time.sleep(10) # "Засыпаем" на 10 секунд app = QtWidgets.QApplication(sys.argv) button = QtWidgets.QPushButton("Запустить процесс") button.resize(200, 40) button.clicked.connect(on_clicked) button.show() sys.exit(app.exec_())
Архив с файлом можно взять здесь.
В этом примере при нажатии кнопки Запустить процесс вызывается функция on_clicked() , внутри которой мы приостанавливаем выполнение программы на десять секунд и тем самым прерываем основной цикл. Попробуйте нажать кнопку, перекрыть окно другим окном, а затем заново его отобразить, - вам не удастся это сделать, поскольку окно перестает реагировать на любые события, пока не закончится выполнение процесса. Короче говоря, программа просто зависнет.
Длительную операцию можно разбить на несколько этапов и по завершении каждого этапа выходить в основной цикл с помощью статического метода processEvents([flags=AllEvents]) из класса QCoreApplication , от которого наследуется класс QApplication . Переделаем предыдущую программу, инсценировав с помощью цикла длительную операцию, которая выполняется 20 секунд.
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets import sys, time def on_clicked(): button.setDisabled(True) # Делаем кнопку неактивной for i in range(1, 21): QtWidgets.qApp.processEvents() # Запускаем оборот цикла time.sleep(1) # "Засыпаем" на 1 секунду print("step -", i) button.setDisabled(False) # Делаем кнопку активной app = QtWidgets.QApplication(sys.argv) button = QtWidgets.QPushButton("Запустить процесс") button.resize(200, 40) button.clicked.connect(on_clicked) button.show() sys.exit(app.exec_())
Архив с файлом можно взять здесь.
В этом примере длительная операция разбита на одинаковые этапы, после выполнения каждого из которых выполняется выход в основной цикл приложения. Теперь при перекрытии окна и повторном его отображении окно будет перерисовано - таким образом, приложение по-прежнему будет взаимодействовать с системой, хотя и с некоторой задержкой.
Со следующего шага мы начнем рассматривать многопоточные приложения .
Разъясните своими словами что такое app.exec_() и что оно делает в PyQt5
Я так понимаю это выход из окна, но если мы выйдем то оно закроется, а не будет ждать пока мы нажмем на кнопку выйти. Кстати, вообще это пишут как-то так sys.exit(app.exec_()) , но я попробовал и 1, и 2 способ разницы я ни какой не увидел. Так вот, Разъясните своими словами что такое app.exec_() и что оно делает в PyQt5?
Отслеживать
76.7k 6 6 золотых знаков 54 54 серебряных знака 120 120 бронзовых знаков
задан 22 ноя 2017 в 12:55
829 4 4 золотых знака 15 15 серебряных знаков 31 31 бронзовый знак
А чем вас не устроила выдержка из оф. документации? "Enters the main event loop and waits until exit() is called"
22 ноя 2017 в 12:57
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Q [Core, Gui] Application используется для доставки сообщений/событий объектам Qt , а также для взаимодействия с "окружающей средой", например оконным менеджером операционной системы.
Метод exec запускает цикл обработки событий, без этого цикла не будут работать виджеты.
Класс QApplication управляет главным потоком и основными настройками приложения с GUI.
Он содержит главный цикл обработки сообщений, где обрабатываются и пересылаются все сообщения посланные оконной системой и другими ресурсами. Также тут реализованы инициализация, завершение приложения и управление сессией. Также в данном классе реализованы возможности расширения системы и приложения.
Виджеты в PyQt5 (часть 2)

Мы обсудим QPixmap, QLineEdit, QSplitter и QComboBox.
QPixMap
QPixMap – это один из виджетов, использующихся для работы с изображениями. Он оптимизирован для показа изображений на экране. В приведенном ниже примере, мы будем использовать QPixMap для того, чтобы показать изображение в окне.
В нашем примере, мы показываем изображение в окне.
Мы создали объект QPixMap.
Мы поместили изображение в виджет QLabel.
QLineEdit
QLineEdit – это виджет, который разрешает вводить и редактировать одну строку текста. Для этого виджета доступны функции "Отменить" и "Повторить", "Вырезать" и "Вставить", а также функция "перетаскивания".
Этот пример показывает виджет строки редактирования и метку. Текст, который мы вбиваем в строку редактирования, немедленно отображается в виджете метки.
Создается виджет QLineEdit.
Если текст в виджете редактирования строки меняется, мы вызываем метод onChanged().
Внутри метода onChanged, мы устанавливаем напечатанный текст в виджет метки. Мы вызываем метод adjustSize(), чтобы менять размер метки соответственно длине текста.
QSplitter
QSplitter позволяет пользователю контролировать размер виджетов путём перетаскивания границы между ними. В нашем примере, мы показываем три виджета QFrame, организованные с двумя разделителями.
В нашем примере, мы имеем три виджета фрейма и два разделителя. Обратите внимание, что в некоторых темах оформления, разделители могут не быть хорошо видимыми.
Для того, чтобы видеть границы между виджетами QFrame, мы используем стилизованный фрейм.
Мы создаём виджет QSplitter и добавляем в него два виджета.
К тому же, мы можем добавить разделитель к ещё одному виджету разделителя.
QComboBox
QComboBox – это виджет, который позволяет пользователю выбирать из списка вариантов (выпадающий список).
Пример показывает QComboBox и QLabel. Блок со списком имеет список из пяти вариантов. Это имена дистрибутивов Linux. Виджет метки показывает выбранный вариант.
Мы создаём виджет QComboBox с пятью вариантами.
После выбора пункта, мы вызываем метод onActivated().
Внутри метода, мы устанавливаем текст выбранного пункта в виджет метки. Мы приспосабливаем размер метки, как в прошлом примере.
В этой части руководства PyQt5, мы рассмотрели другие четыре виджета PyQt5.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте