一、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
| 样式/颜色 | 前景色代码 | 背景色代码 | 说明 |
|---|---|---|---|
| 重置/默认 | 0 | 0 | 重置所有属性 |
| 粗体/高亮 | 1 | 1 | 文字加粗或变亮 |
| 下划线 | 4 | 4 | 文字带下划线 |
| 闪烁 | 5 | 5 | 文字闪烁(部分终端不支持) |
| 反显 | 7 | 7 | 前景背景颜色互换 |
| 黑色 | 30 | 40 | 黑色文字/背景 |
| 红色 | 31 | 41 | 红色文字/背景 |
| 绿色 | 32 | 42 | 绿色文字/背景 |
| 黄色 | 33 | 43 | 黄色文字/背景 |
| 蓝色 | 34 | 44 | 蓝色文字/背景 |
| 品红 | 35 | 45 | 品红色文字/背景 |
| 青色 | 36 | 46 | 青色文字/背景 |
| 白色 | 37 | 47 | 白色文字/背景 |
高级颜色(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、常见应用场景
- 命令行工具美化:让
ls、grep、git等工具的输出更易读。 - 日志系统:区分不同级别的日志(error-红色,warn-黄色,info-绿色,debug-蓝色)。
- 进度指示器:通过光标回退(
\r)和重写实现动态进度条、旋转指示器。 - 交互式cli应用:通过光标定位实现菜单选择、表单填写等复杂界面。
- 终端游戏与动画:实现简单的字符动画效果。
4、注意事项与兼容性
- 并非所有终端都支持:古老的终端或某些环境(如windows旧版cmd)可能不支持部分序列。现代终端(如windows terminal, iterm2, gnome terminal)通常支持良好。
- 重置序列:使用样式后,务必在结尾添加重置序列
\033[0m,否则后续所有文本都会继承该样式。 - windows特殊处理:在python中,windows系统可能需要调用
os.system('color')或使用colorama库来启用ansi支持。 - 性能考虑:过度频繁地输出转义序列可能会影响性能,尤其是在输出大量文本时。
- 可访问性:屏幕阅读器可能无法正确解析颜色代码,重要信息不应仅靠颜色区分。
二、源码分享
效果展示

源码分享
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彩色控制台日志内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论