PySide2将控制台内容打印到textEdit控件

看了国内帖子基本上只有说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?》

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值