Кнопки в PyQT5 с использованием python - PullRequest
0 голосов
/ 09 июля 2020

Я создал кнопку «Назад» в новом окне и кнопку «Далее» в главном окне. После того, как я нажал кнопку «Далее», чтобы отобразить новое окно, оно успешно скрыло текущее главное окно, но когда я нажал кнопку «Назад» в новом окне, приложение автоматически закрывается. Есть идеи?

Код в первом файле mainWindow.py:

from PyQt5 import QtCore, QtGui, QtWidgets

try:
    from secondWindow import Ui_SecondWindow
except:
    import secondWindow

class Ui_firstWindow(object):
        def secondWindow(self):
            self.window = QtWidgets.QMainWindow()
            self.ui = Ui_SecondWindow()
            self.ui.setupUi(self.window)
            self.window.show()
            if self.window.show():
                self.hide

        def setupUi(self, firstWindow):
            firstWindow.setObjectName("firstWindow")
            firstWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(firstWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.btn_next = QtWidgets.QPushButton(self.centralwidget)
            self.btn_next.setGeometry(QtCore.QRect(160, 100, 521, 291))
            self.btn_next.setObjectName("btn_next")

            ######To Open second window###########
            self.btn_next.clicked.connect(self.secondWindow)

            self.label = QtWidgets.QLabel(self.centralwidget)
            self.label.setGeometry(QtCore.QRect(360, 420, 151, 16))
            self.label.setStyleSheet("font: 11pt \"MS Shell Dlg 2\";")
            self.label.setObjectName("label")
            firstWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(firstWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName("menubar")
            firstWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(firstWindow)
            self.statusbar.setObjectName("statusbar")
            firstWindow.setStatusBar(self.statusbar)

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

        def retranslateUi(self, firstWindow):
            _translate = QtCore.QCoreApplication.translate
            firstWindow.setWindowTitle(_translate("firstWindow", "MainWindow"))
            self.btn_next.setText(_translate("firstWindow", "Next"))
            self.label.setText(_translate("firstWindow", "First Window"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    firstWindow = QtWidgets.QMainWindow()
    ui = Ui_firstWindow()
    ui.setupUi(firstWindow)
    firstWindow.show()
    sys.exit(app.exec_())

Коды во втором файле secondWindow.py:

from PyQt5 import QtCore, QtGui, QtWidgets

try:
    from mainWindow import Ui_firstWindow
except:
    import mainWindow
class Ui_SecondWindow(object):
        ###function to go back the first window######
        # @pyqtSlot()
        def openBackFirstWindow(self):
            self.window = QtWidgets.QMainWindow()
            self.ui = Ui_firstWindow()
            self.ui.setupUi(self.window)
            self.window.show()
            if self.window.show():
                self.hide


        def setupUi(self, SecondWindow):
            SecondWindow.setObjectName("SecondWindow")
            SecondWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(SecondWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.btn_back = QtWidgets.QPushButton(self.centralwidget)
            self.btn_back.setGeometry(QtCore.QRect(220, 100, 401, 281))
            self.btn_back.setObjectName("btn_back")

            ###To go back to first windo######
            self.btn_back.clicked.connect(self.openBackFirstWindow)

            self.label = QtWidgets.QLabel(self.centralwidget)
            self.label.setGeometry(QtCore.QRect(370, 440, 151, 16))
            self.label.setStyleSheet("font: 11pt \"MS Shell Dlg 2\";")
            self.label.setObjectName("label")
            SecondWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(SecondWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName("menubar")
            SecondWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(SecondWindow)
            self.statusbar.setObjectName("statusbar")
            SecondWindow.setStatusBar(self.statusbar)

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

        def retranslateUi(self, SecondWindow):
            _translate = QtCore.QCoreApplication.translate
            SecondWindow.setWindowTitle(_translate("SecondWindow", "MainWindow"))
            self.btn_back.setText(_translate("SecondWindow", "Back"))
            self.label.setText(_translate("SecondWindow", "Second Window"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    SecondWindow = QtWidgets.QMainWindow()
    ui = Ui_SecondWindow()
    ui.setupUi(SecondWindow)
    SecondWindow.show()
    sys.exit(app.exec_())

Когда я нажал на спину во втором окне, приложение перестало работать и закрылось само. Есть идеи?

1 Ответ

0 голосов
/ 09 июля 2020

Не изменяйте код, сгенерированный Qt Designer, но создайте другой класс, который наследуется от соответствующего виджета, и используйте начальный класс для его заполнения.

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_firstWindow(object):
        def setupUi(self, firstWindow):
            firstWindow.setObjectName("firstWindow")
            firstWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(firstWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.btn_next = QtWidgets.QPushButton(self.centralwidget)
            self.btn_next.setGeometry(QtCore.QRect(160, 100, 521, 291))
            self.btn_next.setObjectName("btn_next")

#            ######To Open second window###########
#            self.btn_next.clicked.connect(self.secondWindow)

            self.label = QtWidgets.QLabel(self.centralwidget)
            self.label.setGeometry(QtCore.QRect(360, 420, 151, 16))
            self.label.setStyleSheet("font: 11pt \"MS Shell Dlg 2\";")
            self.label.setObjectName("label")
            firstWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(firstWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName("menubar")
            firstWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(firstWindow)
            self.statusbar.setObjectName("statusbar")
            firstWindow.setStatusBar(self.statusbar)

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

        def retranslateUi(self, firstWindow):
            _translate = QtCore.QCoreApplication.translate
            firstWindow.setWindowTitle(_translate("firstWindow", "MainWindow"))
            self.btn_next.setText(_translate("firstWindow", "Next"))
            self.label.setText(_translate("firstWindow", "First Window"))


class Ui_SecondWindow(object):
        def setupUi(self, SecondWindow):
            SecondWindow.setObjectName("SecondWindow")
            SecondWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(SecondWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.btn_back = QtWidgets.QPushButton(self.centralwidget)
            self.btn_back.setGeometry(QtCore.QRect(220, 100, 401, 281))
            self.btn_back.setObjectName("btn_back")

#            ###To go back to first windo######
#            self.btn_back.clicked.connect(self.openBackFirstWindow)

            self.label = QtWidgets.QLabel(self.centralwidget)
            self.label.setGeometry(QtCore.QRect(370, 440, 151, 16))
            self.label.setStyleSheet("font: 11pt \"MS Shell Dlg 2\";")
            self.label.setObjectName("label")
            SecondWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(SecondWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName("menubar")
            SecondWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(SecondWindow)
            self.statusbar.setObjectName("statusbar")
            SecondWindow.setStatusBar(self.statusbar)

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

        def retranslateUi(self, SecondWindow):
            _translate = QtCore.QCoreApplication.translate
            SecondWindow.setWindowTitle(_translate("SecondWindow", "MainWindow"))
            self.btn_back.setText(_translate("SecondWindow", "Back"))
            self.label.setText(_translate("SecondWindow", "Second Window"))


class SecondWindow(QtWidgets.QMainWindow, Ui_SecondWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        

class MainWindow(QtWidgets.QMainWindow, Ui_firstWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        ######To Open second window###########
        self.btn_next.clicked.connect(self.secondWindow)

    def secondWindow(self):
        self.window = SecondWindow()
        ###To go back to first windo######
        self.window.btn_back.clicked.connect(self.openBackFirstWindow)
        self.window.show()
        self.hide()

    ###function to go back the first window######
    def openBackFirstWindow(self):
        self.show()
        self.window.hide()
                

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle('Fusion')
    firstWindow = MainWindow()
    firstWindow.show()
    sys.exit(app.exec_())
...