Задать вопрос
@pypyshka

Как создать новое окно в PyQt5?

Добрый день.

Есть созданное в Designer главное окно с кнопкой. Все это сохранено в файл test.ui.
Также в Designer создано новое пустое окно класса QWidget и сохранено в файл test2.ui.

В файле нового окна test2.py содержится:
def new_form():   
    new_window = uic.loadUi("interface2.ui")
    new_window.setWindowTitle("New form")
    new_window.show()


В файле главного окна test.py:
import test2
main_window.pushButton.clicked.connect(test2.new_form)


Если нажать в главном окне на кнопку, то новое окно откроется и сразу закроется. Подскажите, пожалуйста, как заставить это окно постоянно отображаться?
  • Вопрос задан
  • 8769 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@Sergey6661313
причина: переменная new_window умирает сразу как заканчивается функция new_form() (почему? во славу Сатаны конечно!)
Пути решения:

1) создать какую нибудь глобальную переменную. Но глобальные переменные это плохой тон (незнаю почему) :
new_window = None
def new_form():   
    global new_window
    new_window = uic.loadUi("interface2.ui")
    new_window.setWindowTitle("New form")
    new_window.show()


2) создать переменную глобальный массив окон (так делаю я - это всё ещё "плохой тон" но зато потом можно циклом разом удалить все создаваемые окна например...) :
мой_список_окон = []
def new_form():   
    global мой_список_окон
    new_window = uic.loadUi("interface2.ui")
    new_window.setWindowTitle("New form")
    new_window.show()
    мой_список_окон.append(new_window)


3) назначить new_window дочерю main_window (идиологически правильный вариант):
def new_form(parent):   
    new_window = uic.loadUi("interface2.ui")
    new_window.setWindowTitle("New form")
    new_window.show()
    new_window.setParent(parent)

import test2
main_window.pushButton.clicked.connect(lambda: test2.new_form(main_window))


4) new_window должна быть переменной того обьекта который гарантировано не будет удалён (незнаю насчёт идиалогии... все варианты правильные. ):
def new_form(parent):   
    parent.new_window = uic.loadUi("interface2.ui")
    parent.new_window.setWindowTitle("New form")
    parent.new_window.show()


import test2
main_window.pushButton.clicked.connect(lambda: test2.new_form(main_window))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы