【问题标题】:Buttons in PyQT5 using pythonPyQT5中的按钮使用python
【发布时间】:2020-10-29 17:35:39
【问题描述】:

我在新窗口中创建了一个后退按钮,在主窗口中创建了下一步按钮。在我单击下一个按钮以显示新窗口后,它成功隐藏了当前主窗口,但是当我单击新窗口上的后退按钮时,应用程序会自动关闭。有什么想法吗?

第一个 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_())

当我在第二个窗口中单击后退按钮时,应用程序停止工作并自行退出。有什么想法吗?

【问题讨论】:

标签: python-3.x user-interface button pyqt5 runtime-error


【解决方案1】:

不要修改 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_())

【讨论】:

  • @UtayaSurian 正如 S. Nick 已经指出的那样,您应该修改从pyuic 生成的代码。要了解有关使用这些文件的正确方法的更多信息,请阅读using Designer
猜你喜欢
  • 1970-01-01
  • 2019-04-30
  • 2020-02-17
  • 1970-01-01
  • 2020-01-19
  • 2018-10-11
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多