如何将PyQt5主函数print()输出内容显示到界面QLabel状态标签上
解决方案
实现原理
Python的print()函数默认输出到系统标准输出流sys.stdout,我们只需要自定义一个符合输出流规范的类替换默认的sys.stdout,重写write方法捕获输出内容,再通过Qt自带的信号槽机制将内容传递给QLabel做文本追加即可。信号槽会自动保证UI修改操作都在主线程执行,避免直接更新UI导致的崩溃问题。
完整修改后代码
import sys from PyQt5 import QtCore, QtGui, QtWidgets # 自定义输出重定向类 class OutputRedirector(QtCore.QObject): # 定义输出信号,参数为捕获的文本内容 output_written = QtCore.pyqtSignal(str) def write(self, text): # 发送输出信号 self.output_written.emit(text) def flush(self): # 空实现,避免调用flush时报错 pass class Ui_MainWindow(object): def setupUi(self, MainWindow): # 补上原代码缺失的frame创建逻辑 self.frame = QtWidgets.QWidget(MainWindow) MainWindow.setCentralWidget(self.frame) self.frame.setGeometry(QtCore.QRect(0, 0, 550, 580)) self.status = QtWidgets.QLabel(self.frame) self.status.setGeometry(QtCore.QRect(10, 490, 521, 71)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.status.sizePolicy().hasHeightForWidth()) self.status.setSizePolicy(sizePolicy) font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(16) font.setItalic(True) self.status.setFont(font) self.status.setStyleSheet("background-color: rgb(254, 200, 30);\n" "border: rgb(255,255,255);\n" "border-thick:10px;\n" "border-radius: 10px;\n" "") self.status.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) # 初始文本设为空 self.status.setText("") self.status.setObjectName("status") if __name__ == "__main__": # 先保存原来的标准输出,后续需要恢复可以用 old_stdout = sys.stdout app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) # 初始化输出重定向器 redirector = OutputRedirector() # 绑定信号到QLabel的文本追加逻辑 redirector.output_written.connect(lambda text: ui.status.setText(ui.status.text() + text)) # 替换标准输出 sys.stdout = redirector # print语句会自动输出到QLabel print("Getting ready...Please Wait !!") Add = True Remove = False print("Ready") MainWindow.show() # 程序退出前恢复原来的标准输出 sys.stdout = old_stdout sys.exit(app.exec_())
关键说明
- 如果需要同时在控制台和QLabel显示输出,可以在
OutputRedirector的write方法中添加一行old_stdout.write(text)即可。 - 如果需要清空历史显示内容,调用
ui.status.clear()即可。 - 后续如果有子线程的打印需求,该方案依然适用,信号槽会自动处理线程安全问题。
内容的提问来源于stack exchange,提问作者ProgramHub
相关产品推荐
相关产品推荐

