可以为每个文本框创建一个独立的 PrintLogger
实例,并将 print()
函数的输出重定向到不同的文本框。以下是一个示例,演示了如何将输出重定向到多个文本框:
import sys
from PyQt5.QtWidgets import QApplication, QTextEdit, QVBoxLayout, QWidget
from io import StringIO
class PrintLogger(object):
def __init__(self, text_widget):
self.text_widget = text_widget
self.new_line = True
def write(self, message):
if self.new_line:
self.text_widget.append(message)
else:
self.text_widget.textCursor().insertText(message)
self.new_line = message.endswith('\n')
def flush(self):
pass
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
layout = QVBoxLayout()
# 创建第一个 QTextEdit 组件
self.text_edit1 = QTextEdit()
layout.addWidget(self.text_edit1)
# 创建第二个 QTextEdit 组件
self.text_edit2 = QTextEdit()
layout.addWidget(self.text_edit2)
# 将 print 输出重定向到第一个 QTextEdit 组件
sys.stdout = PrintLogger(self.text_edit1)
# 调用函数以生成图形并输出信息
self.print_information()
self.setLayout(layout)
def print_information(self):
# 这里放置你原来的 print 语句,例如:
graph_id = 0
print("图级信息1:对应图的ID是:", graph_id)
# 将 print 输出重定向到第二个 QTextEdit 组件
sys.stdout = PrintLogger(self.text_edit2)
# 再次调用函数以生成图形并输出信息
print("图级信息2:对应图的ID是:", graph_id)
if __name__ == '__main__':
app = QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
(1): 一个类里面,其中一个函数的print重定向了,那么其它函数的print是不是也输出重定向了?
是,如果在一个类中的一个函数中重定向了 print
,那么在该类的其他函数中的 print
语句也会受到影响,都会输出到相同的重定向目标。这种重定向是全局的.
(2): 如果一个python文件中创建了俩个类,如果一个类中的函数print重定向了,那么另一个类中的print是不是也输出重定向了?
不是,每个类都是独立的命名空间,它们的函数在默认情况下使用的是全局的 sys.stdout
。因此,对 print
输出的重定向只影响到当前类的方法,不会影响到其他类或模块。
(3): 如何让标准输出流重定向回到控制台?
# 恢复标准输出流到控制台
sys.stdout = sys.__stdout__
(4):其它博客的提到:
一定要加上flush函数的定义,之前在优快云上找了很久,都没有这行,导致GUI界面上的Textbrowsers只能输出深度学习训练过程的第一行,不能实现实时刷新的功能,加上这个定义就可以完美解决
pyqt5结合keras+tensorflow实现深度学习训练过程GUI界面编写_深度学习训练平台gui-优快云博客