Python控制台输出格式化:自定义符号框架运行错位问题求解
解决Python控制台带颜色框架错位问题
核心问题原因
控制台框架错位的本质是字符显示宽度不统一:
- 中文、全角符号占2个控制台字符宽度,ASCII字符、半角符号占1个
- colorama的颜色控制代码(如
Fore.GREEN)会被len()统计为字符数,但实际不显示,导致长度计算偏差
具体解决方案
1. 安装依赖库
先安装wcwidth来准确计算字符的实际显示宽度:
pip install wcwidth colorama
2. 关键工具函数
写一个函数,剥离colorama颜色代码后,计算文本的实际显示宽度:
from wcwidth import wcswidth from colorama import Fore, Back, Style def get_display_width(text): # 剥离colorama的颜色控制序列 control_codes = [Fore.BLACK, Fore.RED, Fore.GREEN, Fore.YELLOW, Fore.BLUE, Fore.MAGENTA, Fore.CYAN, Fore.WHITE, Fore.RESET, Back.BLACK, Back.RED, Back.GREEN, Back.YELLOW, Back.BLUE, Back.MAGENTA, Back.CYAN, Back.WHITE, Back.RESET, Style.DIM, Style.NORMAL, Style.BRIGHT, Style.RESET_ALL] cleaned_text = text for code in control_codes: cleaned_text = cleaned_text.replace(code, "") # 返回实际显示宽度 return wcswidth(cleaned_text)
3. 框架生成逻辑
基于实际显示宽度构建对齐的框架,示例代码:
import os import time from colorama import init, Fore, Style init(autoreset=True) # 系统信息获取 os_info = f"{Fore.GREEN}操作系统: {os.name} {os.uname().sysname} {os.uname().release}" run_time = f"{Fore.CYAN}运行时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}" # 框架配置 frame_char = "*" frame_width = 60 # 控制台框架总宽度(按显示宽度算) # 生成顶部边框 top_border = frame_char * frame_width print(top_border) # 处理每行内容,居中对齐并补全框架 for line in [os_info, run_time]: content_width = get_display_width(line) # 计算左右需要填充的空格数(总宽度-内容宽度,平分) left_pad = (frame_width - content_width) // 2 right_pad = frame_width - content_width - left_pad # 拼接框架行 frame_line = f"{frame_char}{' ' * left_pad}{line}{' ' * right_pad}{frame_char}" print(frame_line) # 生成底部边框 bottom_border = frame_char * frame_width print(bottom_border)
额外注意事项
- 确保控制台使用等宽字体(如Consolas、Monaco),非等宽字体也会导致错位
- 如果需要更复杂的多行内容,可封装成类来统一处理宽度计算和对齐
- 若使用Windows系统,确保
colorama.init()正确初始化(默认autoreset=True会自动重置颜色,避免后续文本继承颜色)
内容的提问来源于stack exchange,提问作者Storm
相关产品推荐
相关产品推荐

