PyQt5 使用结合Logging 在 QPlainTextEdit/QTextBrowser 上显示日志信息

news/2024/12/15 18:10:55/文章来源:https://www.cnblogs.com/yqbaowo/p/18608186

PyQt5 使用结合Logging 在 QPlainTextEdit/QTextBrowser 上显示日志信息

本文演示 PyQt5 如何与 Python 的标准库 Logging结合,然后输出日志信息到如:QPlainTextEdit QTextBrowser

代码结构

本文中全部代码全在test_QPlainTextEdit_Log.py这一个文件中编码,步骤中有变动的地方会注释标注,无改动的不会重复显示出来,需要看完整代码的,可直接移步到末尾。

一. 创建测试页面

创建一个最简单的窗口,其中的主要部件就是 QPlainTextEdit

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ Project     : Qt5Examples
@ File        : test_QPlainTextEdit_Log.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description :
"""
import sys
import logging
from typing import Callablefrom PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPlainTextEdit, QTextBrowser
from PyQt5.QtCore import pyqtSignal, QObjectclass 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_())

运行后,可以得到下面这样的窗口
image

二. 添加日志信号以及自定义处理器,并初始化日志

这一步,就需要结合PyQt5的信号机制与Logging标准库了,在初始化日式时,提供了三种处理器,其中最主要的就是 使用自定义的 QtHandler处理器,此处理器将把日志消息发送到对应的 Qt部件,如这里的 QPlainTextEdit

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ Project     : Qt5Examples 
@ 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 = signaldef 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 loggerclass LogWindow(QWidget):"""显示日志的窗口"""... # 忽略 无变化

三. 在显示窗口中调用日志,用于显示更新

#!/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.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)

运行后的效果如下:
image

四. 在其他方法或类中输出消息

#!/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):"""使用举例:在方法中输出日志"""print("这是 打印")logger.info("这是一个方法中的 INFO 消息")logger.warning("这是一个方法中的 WARNING 消息")logger.error("这是一个方法中的 ERROR 消息")class ClassLogging(object):"""使用举例:在类中输出日志"""def __init__(self, logger):self.logger = loggerdef 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):... # 忽略 无变化

运行后的效果如下:
image

五. 使用 QTextBrowser 或者 QTextEdit

为啥要使用 QTextBrowser 或者 QTextEdit,如下:

  • QPlainTextEdit适合显示大量纯文本的显示,性能比QPlainTextEdit更强
  • 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 内容

六. 完整代码

完整代码见:GitHub,Gitee

本文章的原文地址
GitHub主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/853398.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp+vue3+uViewPlus

1、uniapp创建项目2、 HuilderX菜单栏 工具->插件安装 -》前往插件市场安下载安装到对应的项目 导入的时候需要看广告 耐心看完 3、uview-plus在main.js中配置代码 import uviewPlus from @/uni_modules/uview-plusapp.use(uviewPlus) 4、在uni.scss中配置样式: @import…

NAS部署quark-auto-save,实现网盘资源自由

安装拉取镜像docker pull cp0204/quark-auto-save:latest一键运行容器docker run -d--name quark-auto-save-p 5005:5005-e TZ=Asia/Shanghai-v /volume1/docker/quark-auto-save:/app/config # 配置文件路径--restart unless-stoppedcp0204/quark-auto-save:latest系统配置首次…

索引与性能优化

title: 索引与性能优化 date: 2024/12/15 updated: 2024/12/15 author: cmdragon excerpt: 索引是数据库性能优化的重要工具,通过建立索引,可以加速数据的检索和查询操作,从而提高数据库的响应速度。虽然索引能显著改善数据访问性能,但不当的使用也可能导致性能下降。 ca…

Differential Transformer: 通过差分注意力机制提升大语言模型性能

Transformer模型已经成为大语言模型(LLMs)的标准架构,但研究表明这些模型在准确检索关键信息方面仍面临挑战。今天介绍一篇名叫Differential Transformer的论文,论文的作者观察到一个关键问题:传统Transformer模型倾向于过分关注不相关的上下文信息,这种"注意力噪声…

idea简单调试

1.行断点是一个小红原点 然后,在main方法中点击调试,程序运行时会在该点停顿,点击 恢复程序就会继续运行2.详细断点 | 源断点 shift+左键唤出断点是一个小黄圆点,并且有一些信息 若点击挂起再点完成,将会变为小红圆点 点击调试,控制台给出断点位置 3.方法断点 是一个小…

30KW储能PCS逆变器双向变流器设计方案

本方案介绍了一款30KW储能PCS逆变双向变流器方案,是双向DCDC的以及三电平逆变PCS技术。此方案包含了原理图(PDF)格式的,包含控制板,滤波板,DCDC模块以及逆变板。本方案是DSP+CPLD的控制架构,DSP是德州仪器(TI)TMS320F28234PGFA,CPLD是Altera的EPM240T100I5。两个处理…

数据采集大作业

这个项目属于哪个课程2024数据采集与融合技术实践 组名 从你的全世界爬过团队logo:项目简介 项目名称:博物识植项目logo:项目介绍:在探索自然奥秘的旅途中,我们常与动植物相伴而行,却无法准确识别它们,更难以深入了解他们的特征。为了更好地理解和欣赏自然界的多样性,…

SpringBoot——使用http2

使用http2许多浏览器,包括Edge,仅在TLS(即HTTPS)情况下支持HTTP/2。即使服务器端配置为无TLS支持的HTTP/2,浏览器可能仍将回退到HTTP/1.1。所以我们需要有一个证书来开启https。生成自签名证书 使用JDK的keytool工具生成自签名证书。 keytool -genkeypair -alias myalias …

一文学懂Catboost模型

参考: 深入理解CatBoost - 知乎 20240322-2-Catboost面试题-CSDN博客 ​这次终于彻底理解了 CatBoost 原理及应用 豆包大模型

深度强化学习基础(王树森) 1 基本概念

概率论 随机变量:值取决于随机事件的结果 大写字母\(X\)表示随机变量,小写字母\(x\)表示随机变量的观测值 概率密度函数(Probability Density Function, PDF):随机变量在某个确定的取值点附近的可能性连续 or 离散期望: \(p(x)\)为概率密度函数术语 状态(state) 动作(…

bc 与 hbm 一致性比对

01 引言 使用地平线 征程 6 算法工具链时,算法侧在验证 quantized.bc 精度符合预期后,软件侧反馈 hbm 精度不符合预期,此时应该怎么做呢?(“打一架!”) 对于熟悉地平线算法工具链的用户而言,可能会立刻想到,使用 hb_verifier 工具比对 bc 与 hbm 的一致性即可,so eas…

Python3虚拟机和对象

2024年最推荐的python3版本为3.11 python虚拟机和对象 Python对象和虚拟机_v4.pdf Python虚拟机的原理 • 字节码生成 • 虚拟机运行 Python对象的实现 • 数据结构 • 类型系统 • 内存管理 Python虚拟机字节码和机器码有什么区别 字节码和机器码是计算机程序执行的两种不同形…