Pyqt как сделать всплывающее окно

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

На этом шаге мы рассмотрим особенности создания и использования таких окон .

Модальным называется окно, которое не позволяет взаимодействовать с другими окнами в том же приложении, - пока модальное окно не будет закрыто, сделать активным другое окно нельзя. Например, если в программе Microsoft Word выбрать пункт меню Файл | Сохранить как , откроется модальное диалоговое окно, позволяющее выбрать путь и название файла, и, пока это окно не будет закрыто, вы не сможете взаимодействовать с главным окном приложения.

  • NonModal ( или 0) - окно не является модальным. Это поведение окна по умолчанию;
  • WindowModal ( или 1) - окно блокирует только родительские окна в пределах иерархии;
  • ApplicationModal ( или 2) - окно блокирует все окна в приложении.

Окна, открытые из модального окна, не блокируются. Следует также учитывать, что метод setWindowModality() должен быть вызван до отображения окна.

Получить текущее значение модальности позволяет метод windowModality() . Проверить, является ли окно модальным, можно с помощью метода isModal() - он возвращает True , если окно является модальным, и False - в противном случае.

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

Результат работы приложения изображен на рисунке 1.


Рис.1. Результат работы приложения

Если запустить приложение и нажать кнопку Открыть модальное окно , откроется окно, выровненное примерно по центру родительского окна (произвести точное выравнивание вы сможете самостоятельно). При этом получить доступ к родительскому окну можно только после закрытия модального окна, второе же окно блокировано не будет. Если заменить атрибут WindowModal атрибутом ApplicationModal , то оба окна будут блокированы.

Обратите внимание, что в конструктор модального окна мы передали ссылку на первое окно и атрибут Window. Если не указать ссылку, то окно блокировано не будет, а если не указать атрибут, окно вообще не откроется. Кроме того, мы объявили переменную modalWindow глобальной, иначе при достижении конца функции переменная выйдет из области видимости, и окно будет автоматически удалено. Чтобы объект окна автоматически удалялся при закрытии окна, атрибуту WA_DeleteOnClose в методе setAttribute() было присвоено значение True .

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

Не пойму как создать новое окно. Вернее настроить его. Создать получается, но в тот же момент оно пропадает.

это пустое окно, для теста.

Вызываю после сигнала из старого окна:

Отредактировано modos189 (Май 25, 2012 14:00:27)

PyQt создание всплывающего окна

Не очень понятно откуда оно вызывается. Приложите полный пример. Но, предполагаю, проблема в том, что MainWindow создается без задания ему родителя (parent) и на него не сохраняется ссылка. Еще возможно не запускается event loop через exec_.

Кстати, еще в прошлом вашем топике заметил, что вероятно вы не правильно используете сгенерированный в QtDesigner код. Вносить в него изменения нет смысла, файл перезаписывается каждый раз.

В документации есть раздел по использованию сгенерированного кода Using Qt Designer
Попробуйте сделать как там, проблемы должны пропасть.

PyQt создание всплывающего окна

для теста функция вызывается при выборе любого пункта в списке.


“Вносить в него изменения нет смысла, файл перезаписывается каждый раз.”
после изменений в QtDesigner я провожу сверку со своей программой и переношу только новое

пытался сделать по аналогии с первым окном

Отредактировано modos189 (Май 25, 2012 16:58:23)

PyQt создание всплывающего окна

Да, дело в то, что ссылка на MainWindow не сохранена.
Очень простое, но не совсем правильное решение:

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

modos189
“Вносить в него изменения нет смысла, файл перезаписывается каждый раз.”
после изменений в QtDesigner я провожу сверку со своей программой и переношу только новое

Это же очень не удобно.

Правильным бы было реорганизовать ваш код, так как советуют в документации (ссылка в предыдущем посте)

В этой статье рассказывается о разработке простого диалогового окна с помощью инструмента PyQt5 designer tool, а также о преобразовании и интеграции его в python.

Как настроить конструктор PyQt5 и интегрировать пользовательский интерфейс

С PyQt5 вам нужно хорошо разбираться в базовом Python, но я постараюсь сделать это как можно проще.

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

Инструменты, Технологии и библиотеки:

Операционная система: Windows 10

Редактор: Код Visual Studio

Python: 3.6

Библиотеки PyQt5: Если вы еще не установили Python 3.6 на свою ОС, перейдите по этой ссылке , чтобы загрузить установщик Python.

Pip (система управления пакетами, используемая для установки и управления библиотеками и пакетами, написанными на python) должна быть установлена как часть Python.

Если вы не можете найти установку трубы, следуйте инструкциям здесь .

После установки Python и pip используйте следующие команды для установки конструктора PyQt5, инструментов и пакетов.

Вы найдете различные библиотеки с папками PyQt5, установленными в этом месте по умолчанию: C:\Program Файлы (x86)\Python 36-32\Lib\site-packages (в ОС Windows).

Как запустить инструмент PyQt5 Designer

Перейти к C:\Program Файлы (x86)\Python 36-32\Lib\site-packages\pyqt5-tools и найдите designer.exe . Дважды щелкните, чтобы открыть Qt Designer.

Примечание: Путь будет варьироваться в зависимости от используемой ОС.

Qt Designer предоставит некоторые базовые шаблоны. Выберите шаблон “Диалог с кнопками справа”, как показано на скриншоте ниже.

Выбор шаблона PyQt5

Вы можете изменить свойства диалогового окна с помощью редактора свойств. Я просто изменил название окна.

Теперь сохраните разработанный диалог как dialog.ui .

Диалог преобразования.ui to dialog.py

Используйте приведенную ниже команду в командной строке.

Приведенная выше команда преобразует файл dialog.ui в dialog.py .

Затем мы внесем некоторые незначительные изменения и выполним код Python. Я изменил имя класса, сгенерированное командой, чтобы сохранить его значение.

Это окончательный код класса Dialog, сгенерированный из файла dialog.ui.

Это окончательный код класса Dialog, сгенерированный из файла dialog.ui.

Это окончательный код класса Dialog, сгенерированный из файла dialog.ui.

Теперь выполните команду app.py и… вот так. С тобой покончено! Диалог будет выглядеть так.

Я надеюсь, что это было полезно для начинающих Python и PyQt! Пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы с преобразованием разработанного пользовательского интерфейса из конструктора PyQt5.

Этот пост первоначально опубликован автором здесь Эта версия была отредактирована для ясности и может отличаться от оригинальной записи.

programmy-na-pyqt5.jpg

В этой части руководства PyQt5

мы изучим некоторую базовую функциональность.

Этот простой пример выводит маленькое окно. Мы можем делать множество вещей с этим окном. Мы можем менять его размер, раскрывать на весь экран или свернуть в панель задач. Это потребовало бы много программного кода. Кто-то уже запрограммировал эту функциональность. Поскольку это повторяется в большинстве приложений, нет необходимости программировать это с самого начала. PyQt5 – это инструментарий высокого уровня. Если бы мы писали с помощью инструментов более низкого уровня, нижеследующий пример кода мог бы с лёгкостью содержать сотни строк.

Пример кода выше выводит маленькое окно на экране.

Здесь мы обеспечили необходимый импорт модулей. Основные виджеты расположены в модуле PyQt5.QtWidgets.

Каждое приложение PyQt5 должно создать объект приложения. Параметр sys.argv - это список аргументов из командной строки. Скрипты Python могут быть запущены из программной оболочки. Это один из способов, как мы можем контролировать запуск наших скриптов.

Виджет QWidget – это основной класс всех объектов пользовательского интерфейса в PyQt5. Мы обеспечиваем конструктор по умолчанию для QWidget. Конструктор по умолчанию не имеет родителя. Виджет без родителя называется окном.

Метод resize() изменяет размер виджета. Здесь задана ширина 250px и высота 150px.

Метод move() перемещает виджет на позицию с координатами x=300 и y=300 на экране.

Здесь мы устанавливаем название нашего окна. Оно показывается в строке заголовка.

Метод show() отображает виджет на экране. Виджет сначала создаётся в памяти и позже показывается на экране.

Наконец, мы входим в главный цикл приложения. Обработка событий начинается в этой точке. Главный цикл получает события из системы и отправляет их виджетам приложения. Цикл завершается, если мы вызываем метод exit() или главное окно было закрыто. Метод sys.exit() гарантирует чистый выход. Среда будет проинформирована, когда приложение завершится.

Метод exec_() содержит нижнее подчеркивание, потому что exec – уже используемое имя в Python. И, соответственно, имя exec_() было использовано взамен.

Окно Simple

Рисунок: Окно Simple

Иконка приложения

Иконка приложения – это маленькое изображение, которое обычно отображается в верхнем левом углу строки заголовка. В следующем примере мы увидим, как сделать её в PyQt5. Мы также познакомимся с несколькими новыми методами.

Предыдущий пример был написан в процедурном стиле. Язык программирования Python поддерживает и процедурный, и объектно-ориентированный стиль программирования. Программирование в PyQt5 означает объектно-ориентированное программирование (ООП).

Есть три важных вещи в объектно-ориентированном программировании – это классы, данные и методы. Здесь мы создаём новый класс с именем Example. Класс Example наследуется из класса QWidget. Это значит, что мы вызываем два конструктора: первый для класса Example и второй для унаследованного класса. Метод super() возвращает объект родителя класса Example и мы вызываем его конструктор. Метод __init__() – это конструктор класса в языке Python.

Создание GUI поручено методу initUI().

Все три метода были унаследованы из класса QWidget. setGeometry делает две вещи: он определяет место окна на экране и устанавливает его размер. Первые два параметра – позиции x и y нашего окна. Третий – ширина, и четвёртый – высота окна. Фактически, setGeometry сочетает методы resize() и move() в одном. Последний метод устанавливает иконку приложения. Чтобы сделать это, мы создали объект QIcon. QIcon принимает путь к нашей иконке для её отображения.

Приложение и объекты примера созданы. Главный цикл запущен.

Рисунок: Окно с иконкой

Показ всплывающих подсказок

Мы можем обеспечить любой из наших виджетов всплывающей подсказкой.

В этом примере, мы показываем подсказку для двух PyQt5 виджетов.

Этот статический метод устанавливает шрифт, используемый для показа всплывающих подсказок. Мы используем шрифт 10px SansSerif.

Чтобы создать подсказку, мы вызываем метод setTooltip(). Мы можем использовать HTML форматирование текста.

Мы создаём виджет кнопки и устанавливаем всплывающую подсказку для неё.

Меняем размер у кнопки, перемещаем её в окно. Метод sizeHint() даёт рекомендуемый размер для кнопки.

Всплывающие подсказки

Рисунок: Всплывающие подсказки

Закрытие окна

Ниже следует конструктор виджета QPushButton, который мы используем в нашем примере.

Параметр string_text – это текст, который будет отображён на кнопке. Parent – это виджет, на котором мы разместим нашу кнопку. В этом случае это будет QWidget.

Виджеты имеют иерархическую форму. В этой иерархии большинство виджетов имеют родителей. Виджеты без родителей – это окна верхнего уровня.

В этом примере, мы создали кнопку выхода. После нажатия на кнопку, приложение завершается.

Нам необходим объект из модуля QtCore.

Мы создали кнопку. Кнопка является образцом класса QPushButton. Первый параметр конструктора – это метка кнопки. Второй параметр – родительский виджет. Виджет родителя – это Example, который наследуется из QWidget.

Система обработки событий в PyQt5 построена на механизме сигналов и слотов. Если мы кликаем по кнопке, выдаётся сигнал clicked. Слот может быть слотом Qt или любым слотом, вызываемым из Python. QCoreApplication содержит цикл главного события; он обрабатывает и выполняет все события. Метод instance даёт нам его текущий экземпляр. Заметим, что QCoreApplication создаётся с QApplication. Кликнутый сигнал соединяется с методом quit(), который и завершает приложение. Взаимосвязь сделана между двумя объектами: отправителем и получателем. Отправитель – нажатие кнопки, получатель – объект приложения.

Рисунок: Кнопка выхода

Диалоговое окно

Если мы закрываем QWidget, вызывается QCloseEvent. Чтобы изменить поведение виджета, нам необходимо переопределить обработчик событий closeEvent().

Диалоговое окно

Рисунок: Диалоговое окно

Центрирование окна на экране

Нижеследующий скрипт показывает, как мы можем центрировать окно экране.

Класс QtGui.QDesktopWidget предоставляет информацию о пользовательском рабочем столе, включая размер экрана.

Код, который будет центрировать окно, размещён в специальном методе center().

Мы получаем прямоугольник, точно определяющий форму главного окна.

Мы выясняем разрешение экрана нашего монитора. Из этого разрешения, мы получаем центральную точку.

Наш прямоугольник уже имеет высоту и ширину. Теперь мы устанавливаем центр прямоугольника в центр экрана. Размер прямоугольника не изменяется.

Мы перемещаем верхнюю левую точку окна приложения в верхнюю левую точку прямоугольника qr, таким образом центрируя окно на нашем экране.

PyQt5 python3.4
Добрый день, не могу решить задачку. Есть окно сделанное в QtDesigner,в нем кнопка. Как сделать так что б при нажатии на кнопку(self.pushButton_4) выскакивало окно подтверждения выполнения и при положительном ответе функция выполнялась(exemple) а при отрицательном -нет. В интернете полно примеров, но ни один не подходит, а адаптировать их под свои нужды не получается.

Диалоговое окно выбора каталога PyQt5
Использую directory = QFileDialog.getExistingDirectory(), открывается большое окно. А мне нужно.

Python3 + PyQt5 + PyOpenGL = black screen
Разбираюсь в OpenGL. Пытаюсь нарисовать что-то простое, используя питон и PyQt5. На Линуксе данный.


Дочернее окно и повторный запуск в pyqt5
Всем добрый день. Есть QMainWindow, на нем кнопка, на кнопке сигнал clicked связан со слотом.

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