用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_()