用PySider2制作界面,界面如何实时显示控制台打印的结果

用PySider2搭建界面,在界面实时显示控制台打印输出的结果
我参考这个方法https://blog.csdn.net/weixin_43469047/article/details/115587415
尝试利用textEdit控件完成,修改后代码如下(修改加入的代码被**标注,在没有加入相关代码之前,程序是可以正常运行的),但是在图形界面输入参数点击按钮计算后,图形界面就会闪退,报出Process finished with exit code -1073741571 (0xC00000FD)

from PySide2.QtWidgets import QApplication, QMessageBox, QFileDialog
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile, QObject, Signal, SIGNAL
from PySide2.QtGui import QIcon, QTextCursor
from PySide2 import QtCore
import new_main
import multiprocessing
import sys


class EmittingStr(QObject):  # **************
    textWritten = Signal(str)  # ************** 定义一个发送str的信号,这里用的方法名与PyQt5不一样

    def write(self, text):  # **************
        self.textWritten.emit(str(text))  # **************
        loop = QEventLoop()  # **************
        QTimer.singleShot(1000, loop.quit)  # **************
        loop.exec_()  # **************


class Stats:

    def __init__(self):
        # 从文件中加载UI定义
        file_stats = QFile('mainui.ui')
        file_stats.open(QFile.ReadOnly)
        file_stats.close()

        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 比如 self.ui.button , self.ui.textEdit
        self.ui = QUiLoader().load(file_stats)
        self.ui.button_stress.clicked.connect(self.p1)  # 选择应力存放结果的位置
        self.ui.button_work.clicked.connect(self.p2)  # 选择工况次数存放位置
        self.ui.button_result.clicked.connect(self.p3)  # 选择结果存放位置
        self.ui.button_main.clicked.connect(self.main_program)
        sys.stdout = EmittingStr()  # **************
        self.ui.edt_log.connect(sys.stdout, QtCore.SIGNAL("textWritten(QString)"), self.outputWritten)  # **************
        sys.stderr = EmittingStr()  # **************
        self.ui.edt_log.connect(sys.stderr, QtCore.SIGNAL("textWritten(QString)"), self.outputWritten)  # **************

    def outputWritten(self, text):  # **************
        # self.edt_log.clear()
        cursor = self.edt_log.textCursor()  # **************
        cursor.movePosition(QtGui.QTextCursor.End)  # **************
        cursor.insertText(text)  # **************
        self.edt_log.setTextCursor(cursor)  # **************
        self.edt_log.ensureCursorVisible()  # **************

    def p1(self):  # 选择应力存放结果的位置
        folder_path_stress = QFileDialog.getExistingDirectory()  # 选择文件夹
        edit = self.ui.line_stress
        edit.setText(folder_path_stress)  # 在界面中显示

    def p2(self):  # 选择工况次数存放位置
        excel_path = QFileDialog.getOpenFileName()  # 选择文件
        edit = self.ui.line_work
        edit.setText(excel_path[0])  # 在界面中显示

    def p3(self):  # 选择结果存放位置
        folder_path_result = QFileDialog.getExistingDirectory()  # 选择文件夹
        edit = self.ui.line_result
        edit.setText(folder_path_result)  # 在界面中显示

    def main_program(self):  # 主计算程序
        # 获取位置信息
        edit_stress = self.ui.line_stress
        edit_work = self.ui.line_work
        edit_result = self.ui.line_result
        path_location = edit_stress.text()
        path_num_times = edit_work.text()
        path_result = edit_result.text()
        # 获取应力赋值
        edit_one_stress = self.ui.line_one_stress
        edit_sm = self.ui.line_sm
        sn = edit_one_stress.text()
        sm = edit_sm.text()
        # 获取弹性模量
        edit_est = self.ui.line_est
        edit_ec = self.ui.line_ec
        elasticity = edit_est.text()
        ec = edit_ec.text()
        # 获取线程
        bbox = self.ui.box
        num_process = bbox.value()
        # 程序计算
        print(path_location, path_result, path_num_times, num_process, sn, sm, elasticity, ec)
        new_main.result_multiple(path_location, path_result, path_num_times, num_process,
                                 float(sn), float(sm), float(elasticity), float(ec))


if __name__ == '__main__':
    multiprocessing.freeze_support()
    app = QApplication([])
    app.setWindowIcon(QIcon('logo.jpg'))
    stats = Stats()
    stats.ui.show()
    app.exec_()