如何用Python在常规命令提示符中实现平滑渐变与256色显示
在Windows命令提示符(CMD)中实现256色显示的方法
Windows 10 1511及以后的CMD原生支持VT100 ANSI转义序列,借助这些序列就能实现256色显示,Kraken Grabber的效果也是基于这个原理实现的。以下是具体实现步骤:
1. 开启CMD的ANSI转义支持
默认情况下CMD的VT100支持是关闭的,需要先开启:
永久开启(需重启CMD):
执行以下命令修改注册表(无需管理员权限,仅对当前用户生效):reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1 /f修改完成后关闭并重新打开CMD即可生效。
临时开启(程序内动态设置):
如果不想修改注册表,可以在程序中调用Windows API动态开启,以Python为例:import ctypes kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) h_stdout = kernel32.GetStdHandle(-11) # 获取标准输出句柄 mode = ctypes.c_uint32() kernel32.GetConsoleMode(h_stdout, ctypes.byref(mode)) mode.value |= 0x0004 # 启用ENABLE_VIRTUAL_TERMINAL_PROCESSING kernel32.SetConsoleMode(h_stdout, mode)
2. 使用256色ANSI转义码输出内容
256色的转义码格式如下:
- 前景色:
\033[38;5;{色号}m,其中{色号}取值0-255 - 背景色:
\033[48;5;{色号}m - 重置颜色:
\033[0m(必须添加,否则后续内容会沿用当前颜色)
示例:输出完整256色表
用Python实现的完整示例:
import sys import ctypes # 动态开启VT支持 kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) h_stdout = kernel32.GetStdHandle(-11) mode = ctypes.c_uint32() kernel32.GetConsoleMode(h_stdout, ctypes.byref(mode)) mode.value |= 0x0004 kernel32.SetConsoleMode(h_stdout, mode) # 遍历输出所有256色 for i in range(16): line = [] for j in range(16): color_code = i * 16 + j line.append(f"\033[38;5;{color_code}m{color_code:3d}") print(" ".join(line) + "\033[0m")
用批处理实现的示例:
@echo off setlocal enabledelayedexpansion :: 开启VT支持 reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1 /f >nul 2>&1 :: 输出256色表 for /L %%i in (0,1,15) do ( set "line=" for /L %%j in (0,1,15) do ( set /a "color=%%i*16+%%j" set "line=!line
