PyQt5 使用 QPlainTextEdit/QTextBrowser 与 Logging 结合后显示日志信息
1.PyQt5 使用 QFrame 绘制聊天(三角)气泡,并显示文字2.PyQt5 使用 QStackedWidget 实现轮播展示动画(自动与手动)3.PyQt5 使用 QStackedWidget 实现轮播展示动画,但是鼠标移入却疯狂闪烁的解决办法4.PyQt5 使用 QLabel 实现对图片圆角或者圆形图片5.PyQt5 使用 QFrame 实现页面类抽屉式的进入与退出的动画6.PyQt5 使用 QLabel 实现图像 360度 不间断旋转7.PyQt5/6 PySide2/6 在系统底部任务栏编程,用于显示文字(图片)信息8.PyQt5 使用 aiohttp 发送异步请求9.PyQt5 使用 Pyinstaller+multiprocessing 打包多进程应用时,引发的一些问题
10.PyQt5 使用 QPlainTextEdit/QTextBrowser 与 Logging 结合后显示日志信息
PyQt5 使用 QPlainTextEdit/QTextBrowser 与 Logging 结合后显示日志信息
本文演示 PyQt5
如何与 Python
的标准库 Logging
结合,然后输出日志信息到如:QPlainTextEdit
QTextBrowser
上
代码结构
本文中全部代码全在test_QPlainTextEdit_Log.py
这一个文件中编码,步骤中有变动的地方会注释标注,无改动的不会重复显示出来,需要看完整代码的,可直接移步到末尾。
一. 创建测试页面
创建一个最简单的窗口,其中的主要部件就是 QPlainTextEdit
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File : test_QPlainTextEdit_Log.py
@ Author : yqbao
@ Version : V1.0.0
@ Description :
"""
import sys
import logging
from typing import Callable
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPlainTextEdit, QTextBrowser
from PyQt5.QtCore import pyqtSignal, QObject
class LogWindow(QWidget):
"""显示日志的窗口"""
def __init__(self):
super().__init__()
self.setWindowTitle("日志输出")
self.resize(600, 200)
self.log = QPlainTextEdit(self)
self.log.setReadOnly(True) # 设置为只读模式
layout = QVBoxLayout()
layout.addWidget(self.log)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = LogWindow()
window.show()
sys.exit(app.exec_())
运行后,可以得到下面这样的窗口
二. 添加日志信号以及自定义处理器,并初始化日志
这一步,就需要结合PyQt5
的信号机制与Logging
标准库了,在初始化日式时,提供了三种处理器,其中最主要的就是 使用自定义的 QtHandler
处理器,此处理器将把日志消息发送到对应的 Qt部件,如这里的 QPlainTextEdit
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File : test_QPlainTextEdit_Log.py
@ Author : yqbao
@ Version : V1.0.0
@ Description :
"""
class LogSignal(QObject):
"""日志信号"""
log_signal = pyqtSignal(str)
class QtHandler(logging.Handler):
"""日志处理器"""
def __init__(self, signal):
super().__init__()
self.signal = signal
def emit(self, record):
log_entry = self.format(record)
self.signal.log_signal.emit(log_entry)
def init_log(update_log: Callable):
"""初始化日志系统"""
log_signal = LogSignal()
log_signal.log_signal.connect(update_log) # 日志信号连接用于更新显示的槽函数
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 创建文件处理器,将日志写入文件(不需要可删除)
file_handler = logging.FileHandler('application.log', encoding="utf-8") # 文件处理器
file_handler.setLevel(logging.DEBUG) # 设置文件日志的级别
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(file_handler)
# 创建自定义处理器,就日志输出到 Qt 页面显示
qt_handler = QtHandler(log_signal) # 使用自定义的日志处理器
qt_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
logger.addHandler(qt_handler)
# 控制台输出(不需要可删除,删除后控制台将不在输出日志信息,仅显示 print 打印)
stream_handler = logging.StreamHandler() # 输出到控制台
stream_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s "))
logger.addHandler(stream_handler)
return logger
class LogWindow(QWidget):
"""显示日志的窗口"""
... # 忽略 无变化
三. 在显示窗口中调用日志,用于显示更新
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File : test_QPlainTextEdit_Log.py
@ Author : yqbao
@ Version : V1.0.0
@ Description :
"""
class LogWindow(QWidget):
"""显示日志的窗口"""
def __init__(self):
super().__init__()
... # 忽略
self.logger = init_log(self.update_log) # 初始化日志
# 举例
self.logger.info("这是一个消息")
def update_log(self, log_text):
self.log.append(log_text) # 更新 QPlainTextEdit 内容
# 将光标移动到文本的最后一行
cursor = self.log.textCursor()
cursor.movePosition(cursor.End) # 移动光标到最后
self.log.setTextCursor(cursor)
运行后的效果如下:
四. 在其他方法或类中输出消息
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ Project : Qt5Examples
@ File : test_QPlainTextEdit_Log.py
@ Author : yqbao
@ Version : V1.0.0
@ Description :
"""
def fun_logging(logger):
"""使用举例:在方法中输出日志"""
logger.info("这是一个方法中的 INFO 消息")
logger.warning("这是一个方法中的 WARNING 消息")
logger.error("这是一个方法中的 ERROR 消息")
class ClassLogging(object):
"""使用举例:在类中输出日志"""
def __init__(self, logger):
self.logger = logger
def log_output(self):
self.logger.info("这是一个类中的 INFO 消息")
self.logger.warning("这是一个类中的 WARNING 消息")
self.logger.error("这是一个类中的 ERROR 消息")
class LogWindow(QWidget):
"""显示日志的窗口"""
def __init__(self):
super().__init__()
... # 忽略
self.logger = init_log(self.update_log) # 初始化日志
# 举例
self.logger.info("这是一个消息")
# 举例:在其他模块中输出日志
fun_logging(self.logger)
log_example = ClassLogging(self.logger)
log_example.log_output()
def update_log(self, log_text):
... # 忽略 无变化
运行后的效果如下:
五. 使用 QTextBrowser 或者 QTextEdit
为啥要使用 QTextBrowser
或者 QTextEdit
,如下:
QPlainTextEdit
适合显示大量纯文本
的显示,性能比QTextBrowser
更强QTextBrowser
支持富文本(HTML、格式化文本等),可以显示带颜色、字体和其他格式的日志信息。但是文本是只读的。QTextEdit
支持富文本(HTML、格式化文本等),可以显示带颜色、字体和其他格式的日志信息。文本是可以编辑的
举例,修改成 QTextBrowser
显示,只需要修改两句话:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ Project : Qt5Examples
@ File : test_QPlainTextEdit_Log.py
@ Author : yqbao
@ Version : V1.0.0
@ Description :
"""
class LogWindow(QWidget):
"""显示日志的窗口"""
def __init__(self):
super().__init__()
# self.log = QPlainTextEdit(self)
self.log = QTextBrowser(self) # 改成这句
def update_log(self, log_text):
# self.log.appendPlainText(log_text) # 更新 QPlainTextEdit 内容
self.log.append(log_text) # 更新 QTextBrowser 内容
六. 完整代码
本文来自博客园作者:星尘的博客,转载请注明出处:https://www.cnblogs.com/yqbaowo/p/18608186
合集:
PyQt5 使用笔记
分类:
PyQt5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码