Как закрыть окно, через которое было открыто другое PyQt5

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

У меня есть два файла. Первый, из которого вызываю второе окно вот так: И второй файл:

from PyQt5 import QtCore, QtGui, QtWidgets, QtGui
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QUrl, Qt
from PyQt5.QtWidgets import QDesktopWidget
from PyQt5.QtMultimedia import QMediaPlaylist, QMediaPlayer, QMediaContent
from gamepoletru import MainWindow

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.clicked.connect(self.close)
        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 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", "Vitajte v kvízovej hre Collabio!"))
        self.infobtn.setText(_translate("Startmenu", "Informácie"))

class infobtnopen(QMainWindow, Ui_rules):              
    def __init__(self, parent=None):                                                 
        super().__init__()
        self.setWindowIcon(QtGui.QIcon('icons/question.svg')) 
        self.setupUi(self)         
        
class startmenu(QMainWindow,Ui_Startmenu):                          
    def __init__(self, parent=None):
        super(startmenu, self).__init__(parent)
        self.setupUi(self) 
        self.infobtn.clicked.connect(self.infoshow) 
        self.infobtnopen = infobtnopen(self)        

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


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

При нажатии на кнопку "инфо" открывается окно с клавишей "dobre".
Нужно сделать, чтобы при нажатии на нее закрывались два окна. Так же можно эти два класса расписать в 2 файла

Ответы

▲ 0Принят

Я не уверен, что правильно понимаю то, что вы хотите сделать.
Но предложу попробовать следующее:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QUrl, Qt
# ??? from PyQt5.QtWidgets import QDesktopWidget
# ??? from PyQt5.QtMultimedia import QMediaPlaylist, QMediaPlayer, QMediaContent

# ??? from gamepoletru import MainWindow

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.clicked.connect(self.close)
        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)         
# +++ vvv 
        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(QMainWindow, Ui_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_())

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