无法打开第二个窗口,事件循环已在运行-PyQt5

问题描述 投票:0回答:1

我目前正在尝试在一个qt窗口中按下按钮以打开另一个Python文件中的第二个窗口。我的布局代码是通过将Qt Designer中创建的ui转换为python生成的。

我的选择功能代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'movie_design.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets
import add_entry


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(597, 522)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(160, 40, 291, 51))
        font = QtGui.QFont()
        font.setPointSize(14)
        font.setBold(False)
        font.setUnderline(True)
        font.setWeight(50)
        font.setStrikeOut(False)
        font.setKerning(True)
        self.label.setFont(font)
        self.label.setLineWidth(1)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(170, 110, 261, 91))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(170, 230, 261, 91))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(170, 350, 261, 91))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.pushButton_3.setFont(font)
        self.pushButton_3.setObjectName("pushButton_3")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 597, 26))
        self.menubar.setObjectName("menubar")
        self.menuMenu = QtWidgets.QMenu(self.menubar)
        self.menuMenu.setObjectName("menuMenu")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menubar.addAction(self.menuMenu.menuAction())

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

        self.pushButton_2.clicked.connect(self.add)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Movie Database Program"))
        self.pushButton.setText(_translate("MainWindow", "Delete Record"))
        self.pushButton_2.setText(_translate("MainWindow", "Add Record"))
        self.pushButton_3.setText(_translate("MainWindow", "Search Records"))
        self.menuMenu.setTitle(_translate("MainWindow", "Menu"))

    def add(self):
        add_entry.add_entry()



def main():
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    app.exec_()


if __name__ == "__main__":
    main()

如您所见,我创建了一个按钮,当按下该按钮时,它将在程序“ add_entry.py”中调用该函数

添加entry.py代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'add_entry.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(555, 418)
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(10, 30, 533, 28))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.label.setFont(font)
        self.label.setTextFormat(QtCore.Qt.AutoText)
        self.label.setScaledContents(False)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.formLayoutWidget = QtWidgets.QWidget(Dialog)
        self.formLayoutWidget.setGeometry(QtCore.QRect(30, 70, 501, 321))
        self.formLayoutWidget.setObjectName("formLayoutWidget")
        self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.formLayout.setObjectName("formLayout")
        self.label_2 = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_2)
        self.MovieTitle = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.MovieTitle.setObjectName("MovieTitle")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.MovieTitle)
        self.label_3 = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_3)
        self.MovieStudio = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.MovieStudio.setObjectName("MovieStudio")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.MovieStudio)
        self.label_4 = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_4)
        self.dateEdit = QtWidgets.QDateEdit(self.formLayoutWidget)
        self.dateEdit.setObjectName("dateEdit")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.dateEdit)
        self.label_5 = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_5)
        self.ProductionCost = QtWidgets.QSpinBox(self.formLayoutWidget)
        self.ProductionCost.setMaximum(1000000000)
        self.ProductionCost.setObjectName("ProductionCost")
        self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.ProductionCost)
        self.label_6 = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_6.setFont(font)
        self.label_6.setObjectName("label_6")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_6)
        self.BoxOfficeRevenue = QtWidgets.QSpinBox(self.formLayoutWidget)
        self.BoxOfficeRevenue.setMaximum(1000000000)
        self.BoxOfficeRevenue.setObjectName("BoxOfficeRevenue")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.BoxOfficeRevenue)
        self.label_7 = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_7.setFont(font)
        self.label_7.setObjectName("label_7")
        self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_7)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.No = QtWidgets.QRadioButton(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(10)
        self.No.setFont(font)
        self.No.setObjectName("No")
        self.horizontalLayout.addWidget(self.No)
        self.Yes = QtWidgets.QRadioButton(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(10)
        self.Yes.setFont(font)
        self.Yes.setObjectName("Yes")
        self.horizontalLayout.addWidget(self.Yes)
        self.formLayout.setLayout(5, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout)
        self.label_8 = QtWidgets.QLabel(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.label_8)
        self.classificationBox = QtWidgets.QComboBox(self.formLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(10)
        self.classificationBox.setFont(font)
        self.classificationBox.setObjectName("classificationBox")
        self.classificationBox.addItem("")
        self.classificationBox.addItem("")
        self.classificationBox.addItem("")
        self.classificationBox.addItem("")
        self.classificationBox.addItem("")
        self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.classificationBox)
        self.pushButton = QtWidgets.QPushButton(self.formLayoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
        self.pushButton.setSizePolicy(sizePolicy)
        self.pushButton.setObjectName("pushButton")
        self.formLayout.setWidget(7, QtWidgets.QFormLayout.SpanningRole, self.pushButton)

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

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "<html><head/><body><p><span style=\" font-size:12pt; text-decoration: underline;\">Add Entry</span></p></body></html>"))
        self.label_2.setText(_translate("Dialog", "Movie Title"))
        self.label_3.setText(_translate("Dialog", "Movie Studio"))
        self.label_4.setText(_translate("Dialog", "Release Date"))
        self.label_5.setText(_translate("Dialog", "Production Cost (m$)"))
        self.label_6.setText(_translate("Dialog", "Box Office Revenue (m$)"))
        self.label_7.setText(_translate("Dialog", "Have you seen this movie?"))
        self.No.setText(_translate("Dialog", "Yes"))
        self.Yes.setText(_translate("Dialog", "No"))
        self.label_8.setText(_translate("Dialog", "Classification (Age Rating)"))
        self.classificationBox.setItemText(0, _translate("Dialog", "U"))
        self.classificationBox.setItemText(1, _translate("Dialog", "PG"))
        self.classificationBox.setItemText(2, _translate("Dialog", "12"))
        self.classificationBox.setItemText(3, _translate("Dialog", "15"))
        self.classificationBox.setItemText(4, _translate("Dialog", "18"))
        self.pushButton.setText(_translate("Dialog", "Add Entry"))


def add_entry():  
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    app.exec_()

if __name__ == "__main__":
    add_entry()

问题是,当按下按钮时,程序崩溃,告诉我“事件循环已在运行”。我该如何解决?

python python-3.x pyqt5
1个回答
0
投票

Qt,就像许多GUI框架一样,是基于以event loop开头的app.exec_(),然后等待事件响应(来自用户或系统)。对于每个Qt程序,应该始终有一个唯一的运行其事件循环的QApplication实例。

通过您的实现,每次您按下按钮时,您都试图创建并启动新的QApplication,并且出于上述原因,Qt不允许您这样做。

尽管如此,您的代码存在其他问题,因为您以错误的方式使用了生成的UI代码:这些文件应该never用作创建程序代码的基础(实际上,您应该始终保持原样)。我建议您仔细阅读有关using Designer的官方文档,以了解如何使用这些文件。

用pyuic重新生成UI文件,然后创建一个new脚本,该脚本可能包含与此类似的内容:

from PyQt5 import QtWidgets
from ui_mainwindow import Ui_MainWindow
from ui_dialog import Ui_Dialog

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.pushButton_2.clicked.connect(self.add)

    def add(self):
        dialog = Dialog(self)
        dialog.exec_()


class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

在此示例中,我使用了上面给出的文档中解释的第三种方法(多继承方法)。

© www.soinside.com 2019 - 2024. All rights reserved.