You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:06:04