当前位置: 代码网 > it编程>前端脚本>Python > Python+PyQt实现分级彩色控制台日志的示例代码

Python+PyQt实现分级彩色控制台日志的示例代码

2026年08月07日 Python 我要评论
一、ansi转义序列介绍1、什么是ansi转义序列?ansi转义序列(ansi escape sequences)是一套用于控制终端(命令行)文本显示格式的标准代码。它起源于20世纪70年代的ansi

一、ansi转义序列介绍

1、什么是ansi转义序列?

ansi转义序列(ansi escape sequences)是一套用于控制终端(命令行)文本显示格式的标准代码。它起源于20世纪70年代的ansi x3.64标准,通过在普通文本中插入特殊的控制字符序列,可以实现改变文本颜色、移动光标位置、清除屏幕区域、设置字体样式(如粗体、下划线)等多种效果。

简单来说,它让原本只能显示黑白文本的命令行窗口,变得“五彩斑斓”和“可交互”。

一个典型的ansi转义序列以转义字符(escape) 开头,通常是 \033(八进制)、\x1b(十六进制)或 \e(某些环境)。紧随其后的是左方括号 [,然后是具体的参数和指令字母。

基本格式\033[参数;参数...m

例如,\033[31m 表示将后续文本设置为红色。

2、核心功能与常用序列

文本样式与颜色(sgr - select graphic rendition)

这是最常用的功能,用于设置前景色(文字颜色)、背景色和字体样式。

格式\033[代码m

样式/颜色前景色代码背景色代码说明
重置/默认00重置所有属性
粗体/高亮11文字加粗或变亮
下划线44文字带下划线
闪烁55文字闪烁(部分终端不支持)
反显77前景背景颜色互换
黑色3040黑色文字/背景
红色3141红色文字/背景
绿色3242绿色文字/背景
黄色3343黄色文字/背景
蓝色3444蓝色文字/背景
品红3545品红色文字/背景
青色3646青色文字/背景
白色3747白色文字/背景

高级颜色(8位/24位真彩色)

  • 8位(256色)\033[38;5;索引值m(前景)或 \033[48;5;索引值m(背景)
  • 24位真彩色\033[38;2;r;g;bm(前景)或 \033[48;2;r;g;bm(背景)

光标控制

控制光标在终端中的位置。

功能序列说明
光标上移\033[na光标向上移动 n 行
光标下移\033[nb光标向下移动 n 行
光标右移\033[nc光标向右移动 n 列
光标左移\033[nd光标向左移动 n 列
光标定位\033[row;colh\033[row;colf将光标移动到指定行和列(从1开始计数)
保存光标位置\033[s保存当前光标位置
恢复光标位置\033[u恢复到之前保存的光标位置

屏幕控制

控制终端屏幕的显示。

功能序列说明
清屏\033[2j清除整个屏幕
清除从光标到行尾\033[k清除当前行从光标到末尾的内容
清除从光标到行首\033[1k清除当前行从开头到光标的内容
清除整行\033[2k清除光标所在的整行

3、常见应用场景

  1. 命令行工具美化:让 lsgrepgit 等工具的输出更易读。
  2. 日志系统:区分不同级别的日志(error-红色,warn-黄色,info-绿色,debug-蓝色)。
  3. 进度指示器:通过光标回退(\r)和重写实现动态进度条、旋转指示器。
  4. 交互式cli应用:通过光标定位实现菜单选择、表单填写等复杂界面。
  5. 终端游戏与动画:实现简单的字符动画效果。

4、注意事项与兼容性

  1. 并非所有终端都支持:古老的终端或某些环境(如windows旧版cmd)可能不支持部分序列。现代终端(如windows terminal, iterm2, gnome terminal)通常支持良好。
  2. 重置序列:使用样式后,务必在结尾添加重置序列 \033[0m,否则后续所有文本都会继承该样式。
  3. windows特殊处理:在python中,windows系统可能需要调用 os.system('color') 或使用 colorama 库来启用ansi支持。
  4. 性能考虑:过度频繁地输出转义序列可能会影响性能,尤其是在输出大量文本时。
  5. 可访问性:屏幕阅读器可能无法正确解析颜色代码,重要信息不应仅靠颜色区分。

二、源码分享

效果展示

源码分享

import sys
from pyqt6.qtwidgets import qapplication, qmainwindow, qpushbutton, qwidget, qvboxlayout
from pyqt6.qtcore import qinstallmessagehandler, qtmsgtype, qmutex, qmutexlocker

# 全局日志锁
log_mutex = qmutex()

def my_message_handler(msg_type: qtmsgtype, context, msg: str):
    locker = qmutexlocker(log_mutex)
    color_code = ""
    prefix = ""

    if msg_type == qtmsgtype.qtdebugmsg:
        color_code = "\033[36m"
        prefix = "[d]"
    elif msg_type == qtmsgtype.qtinfomsg:
        color_code = "\033[32m"
        prefix = "[i]"
    elif msg_type == qtmsgtype.qtwarningmsg:
        color_code = "\033[33m"
        prefix = "[w]"
    elif msg_type == qtmsgtype.qtcriticalmsg:
        color_code = "\033[31m"
        prefix = "[e]"
    elif msg_type == qtmsgtype.qtfatalmsg:
        color_code = "\033[35m"
        prefix = "[f]"

    log_line = f"{color_code}{prefix} {msg}\033[0m\r\n"
    sys.stdout.write(log_line)
    sys.stdout.flush()


class mainwindow(qmainwindow):
    def __init__(self, parent=none):
        super().__init__(parent)
        self.setwindowtitle("qt log demo")
        self.resize(400, 200)

        # 安装全局日志处理器
        qinstallmessagehandler(my_message_handler)

        # 自建控件布局
        central_widget = qwidget()
        self.setcentralwidget(central_widget)
        layout = qvboxlayout(central_widget)

        self.btn_test = qpushbutton("打印分级日志")
        layout.addwidget(self.btn_test)

        # 绑定点击槽
        self.btn_test.clicked.connect(self.on_pushbutton_clicked)

    def on_pushbutton_clicked(self):
        from pyqt6.qtcore import qdebug, qinfo, qwarning, qcritical
        qdebug("this is debug message!")
        qinfo("this is info message!")
        qwarning("this is warning message!")
        qcritical("this is critical message!")


if __name__ == "__main__":
    app = qapplication(sys.argv)
    w = mainwindow()
    w.show()
    sys.exit(app.exec())

到此这篇关于python+pyqt实现分级彩色控制台日志的示例代码的文章就介绍到这了,更多相关python彩色控制台日志内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

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

发表评论

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