看了国内帖子基本上只有说PyQt5的怎么实现的:
《控制台信息转移到textedit控件上显示——知乎》
《PYQT小笔记(2):控制台内容打印到textEdit控件》
只好去Stack Overflow上看了看大神们怎么做的,找了很长时间才在一个PyQt5的问题下面一个回答看到小小的PySide题外话,最后终于借助这个自己尝试了出来:
一个界面上,我们只实现这个QTextEdit
类型的控件,命名为edt_log
1、定义一个重定向信号,将python要打印的信息从控制台输出 ->重定向到edt_log控件输出
from PySide2.QtCore import QEventLoop, QTimer
from PySide2 import QtCore
# 重定向信号
class EmittingStr(QtCore.QObject):
textWritten = QtCore.Signal(str) # 定义一个发送str的信号,这里用的方法名与PyQt5不一样
def write(self, text):
self.textWritten.emit(str(text))
loop = QEventLoop()
QTimer.singleShot(1000, loop.quit)
loop.exec_()
2、Qt Designer中我们新建窗口MainWindow,新增一个QTextEdit
控件并命名为edt_log。
我们先加入方法outputWritten用于重定向信号
from PySide2 import QtGui
from PySide2.QtCore import Slot
class MainWindow:
... 你的其他代码
@Solt() # 这个装饰器不加也行,下面edt_log要改成你自己文本框的名字
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()
... 你的其他代码
3、还有在MainWindow界面初始化时,就需要连接重定向信号,也就是在__init__方法中写。这里也与PyQt5不同
import sys
class MainWindow:
def __init__(self):
# 下面将输出重定向到QTextEdit控件中
import sys
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)
注意:只对Python输出的控制台有用,如果像是Python调用C++生成的DLL,DLL自己在控制台输出的信息是显示不到QTextEdit
上的。
PySide2参考:
《print - python logging to qtextedit》
《How to capture output of Python’s interpreter and show in a Text widget?》