Проблема с созданием дочерних окон

Рейтинг: 1Ответов: 1Опубликовано: 16.04.2023

Есть файл main.py, который администрирует три окна: choice.py, group.py, single.py.
Три окна были переведены из .ui (создавались в Qt Designer) в .py и никак не редактировались.

В окне choice есть выбор окна: single, group. Кнопки подвязаны правильно и интерфейс работает корректно отдельно в каждом из окон.

from PyQt5.QtCore import QCoreApplication

#импортирование каждого из окон
import choice
import group
import single
from PyQt5 import QtCore, QtGui, QtWidgets
import sys

#создание окна выбора
class win_choice(QtWidgets.QWidget, choice.Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        #подключение кнопок
        self.btn_group.clicked.connect(self.group)
        self.btn_single.clicked.connect(self.single)

    #функция создания окна типа "группа"
    def group(self):
        w_group = win_group()
        w_group.show()
        #self.close()

    #функция создания окна типа "одиночное посещение"
    #до неё не успел дойти т.к. на группе не работает
    def single(self):
        ...

#создание окна типа "группа"
class win_group(QtWidgets.QWidget, group.Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

#запуск приложения
app = QtWidgets.QApplication([])
window = win_choice()
window.show()
sys.exit(app.exec_())

При исполнении групповое окно появляется на миллисекунду и пропадает. После чего окно закрывается, так как после него прописан close.

Код окон не прикладываю, поскольку они очень большие. Если какой-нибудь инфы недостаточно, пожалуйста не минусуйте вопрос напишите в комментариях - я дополню. Заранее премного благодарен.

Ответы

▲ 1Принят

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

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

main.py:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
# ???from PyQt5.QtCore import QCoreApplication

from choice import Ui_Form as Ui_WinChoice
from group import Ui_Form as Ui_WinGroup
#from single import Ui_Form as Ui_WinSingle


class WinGroup(QtWidgets.QWidget, Ui_WinGroup):
    ''' Окно типа "группа" '''
    
    def __init__(self, parent):                               # + parent
        super().__init__()
        self.setupUi(self)
        
        self.parent = parent                                  # + parent
        
    def closeEvent(self, event):                              # +++
        self.parent.show()
        self.close()
        
        
class WinChoice(QtWidgets.QWidget, Ui_WinChoice):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.btn_group.clicked.connect(self.show_win_group)
        self.btn_single.clicked.connect(self.show_win_single)

    def show_win_group(self):
        self.w_group = WinGroup(self)                           # + self
        self.w_group.show()
#        self.close()
        self.hide()                                             # +++

    def show_win_single(self):
        # функция создания окна типа "одиночное посещение"
        # до неё не успел дойти т.к. на группе не работает    
        pass


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    window = WinChoice()
    window.show()
    sys.exit(app.exec_())

choice.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(456, 309)
        self.gridLayout_2 = QtWidgets.QGridLayout(Form)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(14)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 2)
        self.btn_single = QtWidgets.QPushButton(Form)
        self.btn_single.setObjectName("btn_single")
        self.gridLayout.addWidget(self.btn_single, 1, 1, 1, 1)
        self.btn_group = QtWidgets.QPushButton(Form)
        self.btn_group.setObjectName("btn_group")
        self.gridLayout.addWidget(self.btn_group, 1, 0, 1, 1)
        self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "Главное окно"))
        self.btn_single.setText(_translate("Form", "Открыть окно single"))
        self.btn_group.setText(_translate("Form", "Открыть окно group"))

group.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(240, 320)
        self.gridLayout = QtWidgets.QGridLayout(Form)
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(14)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "Окно типа \"группа\""))

введите сюда описание изображения

введите сюда описание изображения