Закрытие нескольких окон PyQt5 только через кнопку

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

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

Задача в том, чтобы при нажатии на крестик во втором окне не закрывались два окна, а только открытое.

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QUrl, Qt

class Ui_rules(object):
    def setupUi(self, rules):
        rules.setObjectName("rules")
        rules.setFixedSize(1293, 772)
        rules.setStyleSheet("background-color: white;\n""")
        self.label_2 = QtWidgets.QLabel(rules)
        self.label_2.setGeometry(QtCore.QRect(0, 0, 1301, 111))
        self.label_2.setStyleSheet("background-color: red;\n"
"color: #FFF;\n"
"font: 24pt \"MS Shell Dlg 2\";")
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        
        self.pushButton = QtWidgets.QPushButton(rules)
        self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton.setGeometry(QtCore.QRect(490, 650, 321, 81))
        self.pushButton.setStyleSheet("QPushButton{\n"
"border: none;\n"
"font: 22pt \"MS Shell Dlg 2\";\n"
"color: rgb(255, 255, 0);\n"
"background-color: rgb(255, 0, 0);\n"
"border-radius: 10px"
"}\n"
"QPushButton:hover{\n"
"border: none;\n"
"font: 22pt \"MS Shell Dlg 2\";\n"
"color: rgb(255, 255, 0);\n"
"background-color: rgb(200, 52, 0);\n"
"border-radius: 10px"
"}\n")
        self.pushButton.setObjectName("pushButton")
        
        self.label = QtWidgets.QLabel(rules)
        self.label.setGeometry(QtCore.QRect(0, 170, 1101, 50))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_3 = QtWidgets.QLabel(rules)
        self.label_3.setGeometry(QtCore.QRect(0, 240, 1101, 50))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(rules)
        self.label_4.setGeometry(QtCore.QRect(0, 310, 1101, 50))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(rules)
        self.label_5.setGeometry(QtCore.QRect(0, 380, 1111, 100))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")

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

    def retranslateUi(self, rules):
        _translate = QtCore.QCoreApplication.translate
        rules.setWindowTitle(_translate("rules", "Pravidlá"))
        self.label_2.setText(_translate("rules", "Rules"))
        self.pushButton.setText(_translate("rules", "Dobre"))
        self.label.setText(_translate("rules", "  ◉ dvaja hráči súťažia o to, kto rýchlejšie odpovie na otázku"))
        self.label_3.setText(_translate("rules", "  ◉ máte 7 sekúnd na odpoveď"))
        self.label_4.setText(_translate("rules", "  ◉ po výbere otázky si treba vybrať, kto bude chodiť"))
        self.label_5.setText(_translate("rules", "  ◉ Stlačte: Q - pre modrý tímový ťah\n"
"                P - pre červený tímový ťah"))


# ???class infobtnopen(QMainWindow, Ui_rules): 
class InfoBtnOpen(QtWidgets.QWidget, Ui_rules): 
    def __init__(self, parent=None):                                                 
        super().__init__()
        self.setWindowIcon(QtGui.QIcon('Ok.png')) 
        self.setupUi(self)         
        self.parent = parent
        self.pushButton.clicked.connect(self.close)
        
    def closeEvent(self, event):
        self.parent.close()
        

class Ui_Startmenu(object):
    def setupUi(self, Startmenu):
        Startmenu.setObjectName("Startmenu")
        Startmenu.setFixedSize(1341, 857)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(Startmenu.sizePolicy().hasHeightForWidth())
        Startmenu.setSizePolicy(sizePolicy)
        Startmenu.setStyleSheet("background-color: rgb(184, 234, 255);")
        self.label = QtWidgets.QLabel(Startmenu)
        self.label.setGeometry(QtCore.QRect(0, 50, 1341, 121))
        self.label.setStyleSheet("background-color: rgb(255, 255, 255);\n"
"font: 22pt \"MS Shell Dlg 2\";\n"
"color: #000\n"
"")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.infobtn = QtWidgets.QPushButton(Startmenu)
        self.infobtn.setGeometry(QtCore.QRect(350, 500, 311, 91))
        self.infobtn.setStyleSheet("QPushButton{\n"
"background-color: rgb(0, 170, 255);\n"
"font: 20pt \"MS Shell Dlg 2\";\n"
"color: white;\n"
"border: none;\n"
"border-radius: 20px"
"}\n"
"\n"
"QPushButton:hover{\n"
"background-color: rgb(0, 136, 255);\n"
"font: 24pt \"MS Shell Dlg 2\";\n"
"color: white;\n"
"border: none;\n"
"border-radius: 20px"
"}\n")
        self.infobtn.setObjectName("infobtn")
        self.retranslateUi(Startmenu)
        QtCore.QMetaObject.connectSlotsByName(Startmenu)

    def retranslateUi(self, Startmenu):
        _translate = QtCore.QCoreApplication.translate
        Startmenu.setWindowTitle(_translate("Startmenu", "Collabio"))
        self.label.setText(_translate("Startmenu", "Добро пожаловать в викторину Collabio!"))
        self.infobtn.setText(_translate("Startmenu", "Информация"))
        
        
class StartMenu(QtWidgets.QWidget, Ui_Startmenu):                         
    def __init__(self, parent=None):
        super(StartMenu, self).__init__(parent)
        self.setupUi(self) 
        
        self.infobtn.clicked.connect(self.info_show) 
        self.infobtnopen = InfoBtnOpen(self)        

    def info_show(self):
        self.infobtnopen.show()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = StartMenu()
    main.show()
    sys.exit(app.exec_())

Ответы

▲ 0Принят

Как вариант:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QUrl, Qt

class Ui_rules(object):
    def setupUi(self, rules):
        rules.setObjectName("rules")
        rules.setFixedSize(1293, 772)
        rules.setStyleSheet("background-color: white;\n""")
        self.label_2 = QtWidgets.QLabel(rules)
        self.label_2.setGeometry(QtCore.QRect(0, 0, 1301, 111))
        self.label_2.setStyleSheet("background-color: red;\n"
"color: #FFF;\n"
"font: 24pt \"MS Shell Dlg 2\";")
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        
        self.pushButton = QtWidgets.QPushButton(rules)
        self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton.setGeometry(QtCore.QRect(490, 650, 321, 81))
        self.pushButton.setStyleSheet("QPushButton{\n"
"border: none;\n"
"font: 22pt \"MS Shell Dlg 2\";\n"
"color: rgb(255, 255, 0);\n"
"background-color: rgb(255, 0, 0);\n"
"border-radius: 10px"
"}\n"
"QPushButton:hover{\n"
"border: none;\n"
"font: 22pt \"MS Shell Dlg 2\";\n"
"color: rgb(255, 255, 0);\n"
"background-color: rgb(200, 52, 0);\n"
"border-radius: 10px"
"}\n")
        self.pushButton.setObjectName("pushButton")
        
        self.label = QtWidgets.QLabel(rules)
        self.label.setGeometry(QtCore.QRect(0, 170, 1101, 50))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_3 = QtWidgets.QLabel(rules)
        self.label_3.setGeometry(QtCore.QRect(0, 240, 1101, 50))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(rules)
        self.label_4.setGeometry(QtCore.QRect(0, 310, 1101, 50))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(rules)
        self.label_5.setGeometry(QtCore.QRect(0, 380, 1111, 100))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")

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

    def retranslateUi(self, rules):
        _translate = QtCore.QCoreApplication.translate
        rules.setWindowTitle(_translate("rules", "Pravidlá"))
        self.label_2.setText(_translate("rules", "Rules"))
        self.pushButton.setText(_translate("rules", "Dobre"))
        self.label.setText(_translate("rules", "  ◉ dvaja hráči súťažia o to, kto rýchlejšie odpovie na otázku"))
        self.label_3.setText(_translate("rules", "  ◉ máte 7 sekúnd na odpoveď"))
        self.label_4.setText(_translate("rules", "  ◉ po výbere otázky si treba vybrať, kto bude chodiť"))
        self.label_5.setText(_translate("rules", "  ◉ Stlačte: Q - pre modrý tímový ťah\n"
"                P - pre červený tímový ťah"))


class InfoBtnOpen(QtWidgets.QWidget, Ui_rules): 
    def __init__(self, parent=None):                                                 
        super().__init__()
        self.setWindowIcon(QtGui.QIcon('Ok.png')) 
        self.setupUi(self)    
        self.parent = parent
        
        self.pushButton.clicked.connect(self.pushButton_clicked)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
        self.flag = False                                             # !!! +++
        
    def pushButton_clicked(self):        
        self.flag = True                                              # !!! +++
        self.close()
        
    def closeEvent(self, event):
        if self.flag:                                                 # !!! +++
            self.parent.close()
        event.accept()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


class Ui_Startmenu(object):
    def setupUi(self, Startmenu):
        Startmenu.setObjectName("Startmenu")
        Startmenu.setFixedSize(1341, 857)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(Startmenu.sizePolicy().hasHeightForWidth())
        Startmenu.setSizePolicy(sizePolicy)
        Startmenu.setStyleSheet("background-color: rgb(184, 234, 255);")
        self.label = QtWidgets.QLabel(Startmenu)
        self.label.setGeometry(QtCore.QRect(0, 50, 1341, 121))
        self.label.setStyleSheet("background-color: rgb(255, 255, 255);\n"
"font: 22pt \"MS Shell Dlg 2\";\n"
"color: #000\n"
"")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.infobtn = QtWidgets.QPushButton(Startmenu)
        self.infobtn.setGeometry(QtCore.QRect(350, 500, 311, 91))
        self.infobtn.setStyleSheet("QPushButton{\n"
"background-color: rgb(0, 170, 255);\n"
"font: 20pt \"MS Shell Dlg 2\";\n"
"color: white;\n"
"border: none;\n"
"border-radius: 20px"
"}\n"
"\n"
"QPushButton:hover{\n"
"background-color: rgb(0, 136, 255);\n"
"font: 24pt \"MS Shell Dlg 2\";\n"
"color: white;\n"
"border: none;\n"
"border-radius: 20px"
"}\n")
        self.infobtn.setObjectName("infobtn")
        self.retranslateUi(Startmenu)
        QtCore.QMetaObject.connectSlotsByName(Startmenu)

    def retranslateUi(self, Startmenu):
        _translate = QtCore.QCoreApplication.translate
        Startmenu.setWindowTitle(_translate("Startmenu", "Collabio"))
        self.label.setText(_translate("Startmenu", "Добро пожаловать в викторину Collabio!"))
        self.infobtn.setText(_translate("Startmenu", "Информация"))
        
        
class StartMenu(QtWidgets.QWidget, Ui_Startmenu):                         
    def __init__(self, parent=None):
        super(StartMenu, self).__init__(parent)
        self.setupUi(self) 
        
        self.infobtn.clicked.connect(self.info_show) 
        self.infobtnopen = InfoBtnOpen(self)        

    def info_show(self):
        self.infobtnopen.show()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = StartMenu()
    main.show()
    sys.exit(app.exec_())

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