当前位置: 代码网 > it编程>前端脚本>Python > python在pyqt5+logging+threading模块实时显示日志代码示例

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

2024年11月16日 Python 我要评论
简介在写小工具时,使用pyqt5生成界面,在代码中使用logging模块来打印信息,现在希望能将logging打印的信息实时展示在界面上,避免主程序运行时整个界面卡住的状态。代码实现通过两py文件来实

简介

在写小工具时,使用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模块实时显示日志内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com