QCoreApplication::exec: 事件循环已经在运行 - 调用另一个 PyQt5 文件

Posted

技术标签:

【中文标题】QCoreApplication::exec: 事件循环已经在运行 - 调用另一个 PyQt5 文件【英文标题】:QCoreApplication::exec: The event loop is already running - Calling another PyQt5 file 【发布时间】:2020-11-01 03:01:52 【问题描述】:

我正在运行一个带有按钮的 PyQt5 应用程序,它应该在单独的窗口中调用另一个 PyQt5 文件。我将按钮设置为调用另一个 PyQt5 中的“main2”函数,该函数 .show 另一个文件。独立它们工作得很好,但是当我尝试以这种方式连接它们时,我得到了上面的错误。

from ShowRecords import main2

class ExerciseTracker(QDialog):
    def __init__(self):
        super().__init__()
        self.myWindow = QDialog()
        #self.title = 'Exercise Tracker'
        self.myWindow.setWindowTitle('Exercise Tracker')
        self.setGeometry(200, 400, 300, 200)
        self.move(60, 15)
        self.layout = QFormLayout()
        self.layout.addRow(QLabel('<h2>Welcome to the App!</h2>', parent=self.myWindow))
        line_edit1 = QLineEdit()
        self.layout.addRow('Day of the week: ', line_edit1)
        line_edit2 = QLineEdit()
        self.layout.addRow('Body Part: ', line_edit2)
        line_edit3 = QLineEdit()
        self.layout.addRow('Input Exercise: ', line_edit3)
        line_edit4 = QLineEdit()
        self.layout.addRow('Input Sets: ', line_edit4)
        line_edit5 = QLineEdit()
        self.layout.addRow('Input Reps: ', line_edit5)
        btn1 = QPushButton('Submit')
        self.layout.addRow(btn1)
        btn2 = QPushButton('Show Records')
        self.layout.addRow(btn2)
        #btn1.clicked.connect('submit')
        btn2.clicked.connect(main2)
        # layout.addWidget()
        self.myWindow.setLayout(self.layout)
        self.myWindow.show()

def main():
    exercise = QApplication(sys.argv)
    view = ExerciseTracker()
    #view.show()
    sys.exit(exercise.exec_())

if __name__ =='__main__':
    main()

另一个文件叫做 ShowRecord 我叫的是这个'

def main2():
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

您可以使用以下方式检查事件循环是否已经在运行:

app = QtCore.QCoreApplication.instance()
if app is None:
    app = QtWidgets.QApplication(sys.argv)

但是,几乎可以肯定有更好的方式来布置您的 gui。一种可能的方法是创建一个 QWidget 子类来封装 Ui_Form 的行为并导入该类而不是不同的 main() 方法。然后您可以让您的 ExerciseTracker 小部件创建子“Ui_Form”小部件,这将保证所有正确的 Qt 内存管理等都在发生。

【讨论】:

以上是关于QCoreApplication::exec: 事件循环已经在运行 - 调用另一个 PyQt5 文件的主要内容,如果未能解决你的问题,请参考以下文章

QT中的线程与事件循环理解

2020-11-20 Qt事件循环

PyQt 和 matplotlib

QEvent大全,有中文解释

Qt之QEvent(所有事件的翻译)

Qt 之 QEvent