Как сделать диалоговое окно pyqt5

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

В этом руководстве по PyQt5 будет показано, как использовать Python 3 и Qt для создания графического интерфейса пользователя в Windows, Mac или Linux. Мы даже расскажем, как самостоятельно написать установщик.

Что такое PyQt5?

PyQt — это библиотека, которая позволяет использовать фреймворк Qt GUI (GUI — это графический интерфейс пользователя) в Python. Сам Qt, как известно, написан на C++. Используя его в Python, вы можете создавать приложения намного быстрее, не жертвуя при этом значительной частью производительности C++.

PyQt5 это самая последняя, пятая версия Qt. Еще можно найти в интернете случайное упоминание PyQt4, но эта версия устарела и больше не поддерживается.

Новый интересный конкурент PyQt — это Qt for Python. Она обладает практически идентичным API, но в отличие от PyQt имеет лицензию LGPL и, следовательно, может использоваться бесплатно даже в коммерческих проектах. Она поддерживается компанией Qt, а значит, скорее всего, за ней будущее. Здесь мы используем PyQt, потому что она более зрелая. Но, так как их интерфейсы очень похожи, вы всегда можете перейти на Qt for Python позднее.

Установка PyQt

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

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

Эта команда создаст директорию venv/ . Чтобы активировать виртуальную среду в Windows, выполните следующую команду:

А для Mac и Linux вот эту:

То, что виртуальная среда активирована, вы можете увидеть по префиксу (venv) в командной строке:


Теперь, чтобы установить PyQt, выполните следующую команду:

Мы используем версию 5.9.2 , потому что не все версии PyQt одинаково стабильны. Данная версия гарантированно будет работать хорошо.

Итак, поздравляем! Вы только что успешно установили PyQt5.

Создание GUI (графического интерфейса пользователя)

Теперь самое время написать ваш первый графический интерфейс! В нашей виртуальной среде запустим Python и выполним следующие команды:


Сначала мы загружаем библиотеку PyQt при помощи оператора import :

Затем мы создаем QApplication при помощи следующей команды:

Это обязательное требование библиотеки Qt: каждое приложение с графическим интерфейсом пользователя должно иметь ровно один экземпляр класса QApplication . До выполнения данной строки многие вещи в Qt просто не работают. Поэтому такая команда будет присутствовать в каждом вашем Qt приложении.

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

Затем мы даем команду вывести это на экран:

Эта команда покажет небольшое окошко (его вид зависит от вашей операционной системы):


Если все это сработало, как ожидалось, тогда супер! Вы только что создали при помощи Python и библиотеки Qt свое первое приложение с графическим интерфейсом.

Виджеты

На следующей картинке показаны наиболее распространенные виджеты Qt:


Они перечислены ниже в порядке сверху вниз и слева направо:

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

Макеты

Как и в приведенном выше примере, ваш графический интерфейс, скорее всего, будет состоять из нескольких виджетов. В этом случае вам нужно указать Qt, как их расположить. Например, вы можете использовать QVBoxLayout для вертикального расположения виджетов:


Вот код, создающий интерфейс, изображенный на картинке выше:

Как и ранее, мы создали экземляр класса QApplication . Затем мы создаем само окно ( window ). Мы используем для него самый простой тип QWidget , так как он просто используется как контейнер, а никакого особого поведения нам задавать не нужно. Затем мы создаем макет ( layout ) и добавляем к нему две кнопки QPushButton . Наконец, мы говорим окну использовать именно этот макет (и, следовательно, его содержимое). Как и в нашем первом приложении, мы заканчиваем вызовами методов .show () и app.exec_ () .

Безусловно, существует большое количество разных макетов, например QHBoxLayout для размещения элементов в ряд. Более подробно с ними можно ознакомиться в документации Qt.

Пользовательские стили

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

Встроенные стили

Самый грубый способ изменить внешний вид вашего приложения — установить глобальный стиль. Вспомните изображение виджетов, которое мы уже приводили выше:


Здесь используется стиль под названием Fusion . Если вместо этого использовать стиль Windows , это будет выглядеть следующим образом:


Чтобы применить стиль, нужно использовать метод app.setStyle (…) :

Пользовательские цвета

Если вам нравится стиль, но вы хотите изменить его цвета (например, на темную тему), вы можете использовать QPalette и app.setPalette (. ) . Например:

Это изменит цвет текста в кнопках на красный:

Как создать темную тему стиля Fusion, можно посмотреть вот здесь.

Таблицы стилей

В дополнение к вышесказанному вы можете изменить внешний вид своего приложения с помощью таблиц стилей. Это аналог CSS в Qt. Например, мы можем добавить некоторое пространство:


Для получения дополнительной информации о таблицах стилей смотрите документацию Qt.

Сигналы и слоты

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

Компилируем наше приложение

Теперь у вас есть базовые знания для создания GUI, который реагирует на ввод пользователя. Допустим, вы написали приложение. Оно работает на вашем компьютере. Как передать его другим людям, чтобы они тоже могли его запустить?

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

В мире Python процесс превращения исходного кода в автономный исполняемый файл называется замораживанием (freezing). Несмотря на наличие множества библиотек, решающих эту проблему, например PyInstaller , py2exe , cx_Freeze , bbfreze , py2app и так далее, замораживание приложений PyQt всегда было на удивление непростой проблемой.

Мы будем использовать новую библиотеку под названием fbs , которая позволяет создавать автономные исполняемые файлы для приложений PyQt. Для ее установки введите команду:

Затем выполним следующую команду:

Вам будет предложено ввести несколько значений:


Когда вы введете предложенную команду run , должно открыться пустое окно:


Это приложение PyQt5, такое же, как и те, что мы видели раньше. Его исходный код находится в src/main/python/main.py в вашем текущем каталоге. Но вот что самое интересное: мы можем использовать fbs, чтобы превратить его в отдельный исполняемый файл!

Бонус: создаем установщик

Библиотека fbs также позволяет вам создать установщик для вашего приложения с помощью команды fbs installer :


(Если вы работаете в Windows, вам сначала нужно установить NSIS и поместить путь к нему в свой PATH.)

За дополнительной информацией по использованию библиотеки fbs обратитесь к ее документации.

Итоги

Если вы дошли до этого места — примите наши поздравления. Надеемся, теперь у вас есть хорошее представление о том, как для написания приложений Python можно использовать PyQt (и различные ее части). Мы также узнали, как можно создавать автономные исполняемые файлы и установщики при помощи fbs.

Лаборатория Django-разработки

За 3 месяца отработай навыки Django-разработки до профессионального уровня на серьезном проекте под руководством наставника.

18 декабря 2020 mob25


На этом шаге мы рассмотрим назначение этого класса, иерархию наследования, формы его конструкторов, перечислим основные методы.


Класс QDialogButtonBox представляет контейнер, в который можно добавить различные кнопки: как стандартные, так и пользовательские. Внешний вид контейнера и расположение кнопок в
нем зависят от используемой операционной системы. Иерархия наследования для класса QDialogButtonBox:


Форматы конструктора класса QDialogButtonBox:


В параметре parent может быть указана ссылка на родительский компонент. Параметр задает порядок расположения кнопок внутри контейнера. В качестве
значения указываются атрибуты Horizontal (по горизонтали - значение по умолчанию) или Vertical (по вертикали) класса QtCore.Qt. В параметре указываются следующие атрибуты
(или их комбинация через оператор |) класса QDialogButtonBox:

  • NoButton - кнопки не установлены;
  • Ok - кнопка ОК с ролью AcceptRole;
  • Cancel - кнопка Cancel с ролью RejectRole;
  • Yes - кнопка Yes с ролью YesRole;
  • YesToAll - кнопка Yes to All с ролью YesRole;
  • No - кнопка No с ролью NoRole;
  • NoToAll - кнопка No to All с ролью NoRole;
  • Open - кнопка Open с ролью AcceptRole;
  • Close - кнопка Close с ролью RejectRole;
  • Save - кнопка Save с ролью AcceptRole;
  • SaveAll - кнопка Save All с ролью AcceptRole;
  • Discard - кнопка Discard или Don't Save (надпись на кнопке зависит от операционной системы) с ролью DestructiveRole;
  • Apply - кнопка Apply с ролью ApplyRole;
  • Reset - кнопка Reset с ролью ResetRole;
  • RestoreDefaults - кнопка Restore Defaults с ролью ResetRole;
  • Help - кнопка Help с ролью HelpRole;
  • Abort - кнопка Abort с ролью RejectRole;
  • Retry - кнопка Retry с ролью AcceptRole;
  • Ignore - кнопка Ignore с ролью AcceptRole.

  • setOrientation ( ) - задает порядок расположения кнопок внутри контейнера. В качестве значения указываются атрибуты Horizontal (по горизонтали) или
    Vertical (по вертикали) класса QtCore.Qt;
  • setStandardButtons ( ) - добавляет в контейнер стандартные кнопки. Пример:
  • addButton () - добавляет кнопку в контейнер. Форматы метода:


Первый формат добавляет стандартную кнопку или кнопки - значение параметра должно представлять собой один из рассмотренных ранее атрибутов класса QDialogButtonBox или их
комбинацию через оператор |. Второй формат принимает в качестве первого параметра надпись для добавляемой кнопки, а в качестве второго - ее роль. Третий формат принимает добавляемую кнопку
в виде экземпляра одного из классов-потомков класса QAbstractButton - как правило, класса QPushButton, представляющего обычную кнопку.


В качестве роли указывается один из следующих атрибутов класса QDialogButtonBox:

  • InvalidRole (или -1) - ошибочная роль;
  • AcceptRole (или 0) - нажатие кнопки устанавливает код возврата равным значению атрибута Accepted;
  • RejectRole (или 1) - нажатие кнопки устанавливает код возврата равным значению атрибута Rejected;
  • DestructiveRole (или 2) - кнопка для отказа от изменений;
  • ActionRole (или 3) - нажатие кнопки приводит к выполнению операции, которая не связана с закрытием окна;
  • HelpRole (или 4) - кнопка для отображения справки;
  • YesRole (или 5) - кнопка Yes;
  • NoRole (или 6) - кнопка No;
  • ResetRole (или 7) - кнопка для установки значений по умолчанию;
  • ApplyRole (или 8) - кнопка для принятия изменений.


Если роль недействительна, кнопка добавлена не будет.


Первый и второй форматы возвращают ссылку на сгенерированную и добавленную в контейнер кнопку, третий не возвращает ничего. Пример:

Мне нужно создать собственное всплывающее окно ввода, запускаемое нажатием QPushButton в моем приложении (через clicked ). Он должен получить несколько входных данных от пользователей разных типов, а затем вернуть их вызывающей функции внутри приложения главного окна. Я нашел встроенные функции, такие как QInputDialog , которые могут сделать это для отдельных входных данных, но я не могу понять, как это сделать в случае всплывающего окна, которое запрашивает несколько входов различных типов одновременно ( желательно в окне, разработанном в Qt Designer). Кто-нибудь знает как это сделать?

1 ответ

Единого решения не существует, но я дам вам руководство, чтобы делать то, что вы хотите.

enter image description here

Затем, когда вы показываете свой код, вы создаете класс, который наследуется от QDialog, а затем создаете метод, в котором вы получаете результаты, но для этого не используйте show() , а exec_()

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 хостинг.

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