python在pyqt5+logging+threading模块实时显示日志代码示例

 更新时间:2024年11月15日 15:14:58   作者:d_thon_life  
这篇文章主要介绍了如何使用Python的PyQt5和logging模块来实现日志的实时打印到界面上,避免主程序运行时界面卡住,文章还提到了在执行过程中可能遇到的异常及解决方法,需要的朋友可以参考下

简介

在写小工具时,使用pyqt5生成界面,在代码中使用logging模块来打印信息,现在希望能将logging打印的信息实时展示在界面上,避免主程序运行时整个界面卡住的状态。

代码实现

通过两py文件来实现:

  • logging_handler.py 在代码中,我们使用logging模块来记录日志,不仅可以方便的自定义日志格式,还能随时在希望的地方插入日志。
  • main.py 使用pyqt5实现页面,配置控件,并通过threading模块实现子线程实时打印日志。

logging.Handler重写

我们需要写一个logging.Handler的子类,并重写其emit的方法,emit方法的官方介绍如下:

emit(record)
Do whatever it takes to actually log the specified logging record. This version is intended to be implemented by subclasses and so raises a NotImplementedError.
可以对指定的日志记录做任务事。(写到数据库、存到本地等都可以)

logging_handler代码如下:

import logging
from PyQt5.QtWidgets import QTextBrowser

# 设置全局的日志记录格式和日志等级
logging.basicConfig(format="%(asctime)s %(name)s %(levelname)s %(message)s", level=logging.INFO)


class QTextBrowerHandler(logging.Handler):
    """
    接收一个接数text_browser,他是一个pyqt5的QTextBrowser控件,特征是不可编辑的文本框,适合用来记录日志
    """

    def __init__(self, text_browser: QTextBrowser):
        super().__init__()
        self.text_browser = text_browser

        # 给此handler定义日志的格式
        formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
        self.setFormatter(formatter)

    def emit(self, record):
        """日志处理函数,格式化日志数据后,写入到QTextBrower控件中"""
        msg = self.format(record)
        self.text_browser.append(msg)

# 创建一个logger实例,其他模块引用该实例来记录日志
logger = logging.getLogger()

界面创建与日志实时打印

main.py代码如下

from PyQt5.QtWidgets import QWidget, QTextBrowser, QFrame, QGridLayout, QLabel, QPushButton, QApplication
import time, sys
from logging_handler import logger, QTextBrowerHandler
import threading

class MyTest(QWidget):

    def __init__(self):
        super(MyTest, self).__init__()
        self.initUI()
        self.setWindowTitle('devops_it')
        self.setGeometry(300, 100, 800, 800)
        self.show()

    def initUI(self):
        self.page_frame = QFrame(self)
        self.grid = grid = QGridLayout(self.page_frame)
        self.setLayout(grid)

        # 配置各个控件,布局页面
        log_label = QLabel('日志记录')
        log_edit = QTextBrowser()
        log_bt = QPushButton('程序启动')
        log_bt.clicked.connect(self.log_print)

        # 将自定义的handler绑定QTextBrowser控件实例后,再绑定到logger实例上
        handler = QTextBrowerHandler(log_edit)
        logger.addHandler(handler)

        grid.addWidget(log_label, 0, 0)
        grid.addWidget(log_bt, 0, 1)
        grid.addWidget(log_edit, 1, 0)

    def log_print(self):
        """按钮触发的函数"""
        def func():
            for i in range(10):
                logger.info('我正在打印日志%s'%i)
                logger.info('我等待一秒')
                time.sleep(1)

        # 创建子线程,主线程不阻塞同步执行指定函数
        added_thread = threading.Thread(target=func)
        added_thread.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyTest()
    sys.exit(app.exec_())

执行main.py

实现效果如下,持续实时打印

注:如果解释器执行时发生异常报错:Process finished with exit code -1073741819 (0xC0000005)

执行如下操作:

在File->Settings->Build,Execution,Deployment->Python Debugger中去掉勾选的PyQt compatible点击确定。

总结

到此这篇关于python在pyqt5+logging+threading模块实时显示日志的文章就介绍到这了,更多相关pyqt5 logging threading模块实时显示日志内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python测试Kafka集群(pykafka)实例

    Python测试Kafka集群(pykafka)实例

    今天小编就为大家分享一篇Python测试Kafka集群(pykafka)实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python通过get,post方式发送http请求和接收http响应的方法

    python通过get,post方式发送http请求和接收http响应的方法

    这篇文章主要介绍了python通过get,post方式发送http请求和接收http响应的方法,涉及Python使用urllib模块与urllib2模块实现get与post发送数据的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 使用Python读取Excel数据在PPT中创建图表

    使用Python读取Excel数据在PPT中创建图表

    使用Python从Excel读取数据并在PowerPoint幻灯片中创建图表不仅能够极大地简化图表创建过程,通过Python这一桥梁,我们可以轻松实现数据自动化处理和图表生成,本文将演示如何使用Python读取Excel数据在PPT中创建图表,需要的朋友可以参考下
    2024-08-08
  • python if not in 多条件判断代码

    python if not in 多条件判断代码

    学了一段时间python,发现有时遇到多条件判断的时候,觉得使用单纯的in的话比较麻烦,需要多个条件,今天又遇到一个,网上搜索了一下,也有同学和我遇到相同的问题,记录一下
    2016-09-09
  • NumPy中的维度Axis详解

    NumPy中的维度Axis详解

    今天小编就为大家分享一篇NumPy中的维度Axis详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 浅谈python中常用的excel模块库

    浅谈python中常用的excel模块库

    本文主要介绍了python中常用的excel模块库,感兴趣的同学,可以参考下。
    2021-06-06
  • python 从远程服务器下载东西的代码

    python 从远程服务器下载东西的代码

    python实现从远程服务器下载东西的代码,有需要的朋友可以参考下
    2013-02-02
  • 浅谈Python中的zip()与*zip()函数详解

    浅谈Python中的zip()与*zip()函数详解

    这篇文章主要介绍了浅谈Python中的zip()与*zip()函数详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • pycharm修改内存后无法启动的解决

    pycharm修改内存后无法启动的解决

    本文介绍了修改PyCharm配置文件以调整JVM虚拟机内存参数的方法,包括修改pycharm64.exe.vmoptions和pycharm.vmoptions文件,以及调整系统环境变量等内容
    2026-04-04
  • python merge、concat合并数据集的实例讲解

    python merge、concat合并数据集的实例讲解

    下面小编就为大家分享一篇python merge、concat合并数据集的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04

最新评论