IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python logging通过tkinter的Text控件显示日志 -> 正文阅读

[Python知识库]python logging通过tkinter的Text控件显示日志

logging自带的handler有很多类型,StreamHandler、FileHandler、RotatingFileHandler、TimedRotatingFileHandler、NullHandler、WatchedFileHandler、SocketHandler、DatagramHandler、SysLogHandler、NtEventHandler、SMTPHandler、MemoryHandler、HTTPHandler

我想在GUI界面上显示日志内容,以上Handler都不支持。想到了两个思路,最后实现都成功了,而且很简单。

思路一:以tk.Text为父类创建一个新的类,增加相关的功能以适配 StreamHandler。在创建StreamHandler时作为参数传入。

实现:参考sys.stdou,因为StreamHandler(stream) 常规用法是把sys.stdout作为参数传进去的,查看StreamHandler源码见到其实就是在里面调用了sys.stdout的write()方法,即相当于print()。给新的类添加write()方法就可以了

思路二:构造一个新的Handler类,可以支持直接把tk.Text控件作为参数传入。

查了一下,发现各种handler最核心就是里面的 def emit(self, record) 这个函数,它确定了在哪里输出。重写emit函数即可。

# -*- coding: utf-8 -*-
import tkinter as tk
import datetime
import logging

# 方案一
class LoggerBox(tk.Text):

    def write(self, message):
        self.insert("end", message)

# 方案二
class TextboxHandler(logging.Handler):
    def __init__(self, textbox):
        logging.Handler.__init__(self)
        self.textbox = textbox

    def emit(self, record):
        msg = self.format(record)
        self.textbox.insert("end", msg + "\n")


class App:
    def __init__(self, root):
        root.title("TextBox logger")
        root.geometry("600x300")

        tk.Button(root,text="Button",command=self.btn_command).place(x=150,y=40,width=70,height=25)
        
        # 方案一
        streamHandlerBox = LoggerBox(root, width=50,height=5)
        streamHandlerBox.place(x=40,y=70)
        self.log1=logging.getLogger('log1')
        self.log1.setLevel(logging.INFO)
        handler = logging.StreamHandler(streamHandlerBox)
        self.log1.addHandler(handler)


        # 方案二
        normalTextBox = tk.Text(root, width=50,height=5)
        normalTextBox.place(x=40,y=200)
        self.log2=logging.getLogger('log2')
        self.log2.setLevel(logging.INFO)
        handler = TextboxHandler(normalTextBox)
        self.log2.addHandler(handler)


    def btn_command(self):
        now = datetime.datetime.now()
        self.log1.info(f"LoggerBox:{now}")
        self.log2.info(f"TextboxHandler:{now}")

if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    root.mainloop()

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:44:46  更:2022-03-13 21:45:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:26:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码