Pyqt5 как сделать второе окно

Добавил пользователь Дмитрий К.
Обновлено: 11.09.2024

Я создал графический интерфейс с PyQt5. У меня всего три окна. Первое окно имеет одну кнопку ( **btn_OpenSecondWIndow** ), которая открывает второе окно. Второе окно имеет одну кнопку ( **btn_OpenCalendar** ), которая открывает третье (Календарь) окно. пользователь выбирает дату оттуда и выбирает кнопку ( **btn_selecteddate** ) в третьем окне, я хочу отобразить этот выбор на метке ( label_Date ) во втором окне.

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

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, таким образом центрируя окно на нашем экране.

Я новичок в программировании на Python GUI. У меня проблемы с созданием графического интерфейса. У меня есть главное окно с виджетами на нем. Я хочу знать, как заменить существующее окно новым окном, когда происходит событие (например, нажатие кнопки).
Ответ на аналогичный вопрос здесь Замените CentralWidget в MainWindow, предлагает использовать QStackedWidgets, но они не использовали Qt Designer для создания своих графических приложений, тогда как у меня есть два файла .py, один это главный файл окна, а другой – окно, которое я хочу показать после нажатия кнопки, поэтому я не знаю, как объединить эти два в моем файле main.py.
Например, главное окно выглядит следующим образом:

И после нажатия на кнопку он должен заменить существующее окно следующим:

Я также хотел бы знать, должно ли второе окно быть типа QStackedWindow, QDialog или QWidget?
Вот мой main.py код

Вероятно, вы не хотите создавать и удалять кучу окон, но если вы действительно этого хотите, вы можете сделать это, как это

В классе OtherWindow

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

Вы можете использовать QStackedWindow для создания всего нового окна и hten подключить его к главному окну через событие onclick().

Или вы можете просто использовать

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

Вы можете использовать QWindow вместо QWidgets, если вы предпочитаете, или другой макет для размещения ваших “объектов” или чего-то еще. Может быть, немного измените, как добавлять элементы внутри макета, если не виджет… такие вещи.:)

Кстати, PyQt5, если вы хотите использовать PyQt4, вам нужно изменить импорт, который все.

Pysimplegui – один из самых легких Python Guis, чтобы начать. Он заворачивает другой Python Guis и дает им общий интерфейс. Вы можете прочитать больше об этом в моем Вступление в Pysimplegui Или в моей статье для настоящего Питона Pysimplegui: простой способ создать графический интерфейс с Python Отказ

Начиная

Вы захотите установить Pysimplegui, чтобы начать использовать его. Вы можете использовать Pip для этого:

Сделать модаль окна

Pysimplegui предоставляет Окно Элемент, который вы используете для отображения других элементов, таких как кнопки, текст, изображения и многое другое. Эти окна могут быть сделаны модальными. Модальное окно не позволит вам взаимодействовать с любыми другими окнами в вашей программе, пока вы не выйдете на нее. Это полезно, когда вы хотите заставить пользователю что-то прочитать или задавать вопрос пользователя. Например, модальный диалог может быть использован для того, чтобы попросить пользователя, если они действительно хотят выйти из вашей программы или отобразить диалог конечного пользователя (EULA).

Вы можете создать два окна и показывать их одновременно в PysimpleGui, как это:

Когда вы запустите этот код, вы увидите небольшое главное окно, которое выглядит так:

Это второе окно имеет параметр с именем модал в этом, который установлен на Правда Отказ Это означает, что вы не можете взаимодействовать с первым окном, пока не закроете второй.

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

Создание нового окна в режиме онлайн

Вам не нужно писать полностью отдельную функцию для вашего вторичного окна. Если у вас не будет много виджетов во втором окне, вы можете создать окно как один или два вкладыша.

Вот один из способов сделать это:

Традиционный шаблон нескольких оконных конструкций

Pysimplegui имеет рекомендуемый способ работы с несколькими окнами. Это упоминается в их Кулинарная книга и в их Демоны на Github Отказ Вот пример из Demo_design_pattern_multiple_windows.py:

Когда вы запускаете этот код, вы можете открыть несколько различных окон, которые выглядят так:

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

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