Windows7之后的Windows系统自带的CMD或者Powershell,就不再支持ANSI代码来控制颜色了。那么我们如果想要改变Windows的命令行颜色,只好通过Windows给的句柄来控制颜色。
import sys
import ctypes
if sys.platform.startswith('win'):
stdout = ctypes.windll.kernel32.GetStdHandle(-11)
def printf(value, color=None, **kwargs):
if color is None:
print(value, flush=True, **kwargs)
elif color == "green":
ctypes.windll.kernel32.SetConsoleTextAttribute(stdout, 0x0a)
print(value, flush=True, **kwargs)
elif color == "yellow":
ctypes.windll.kernel32.SetConsoleTextAttribute(stdout, 0x0e)
print(value, flush=True, **kwargs)
elif color == "red":
ctypes.windll.kernel32.SetConsoleTextAttribute(stdout, 0x0c)
print(value, flush=True, **kwargs)
else:
raise AttributeError("The color is unexpected!")
ctypes.windll.kernel32.SetConsoleTextAttribute(stdout, 0x0f)
首先ctypes.windll.kernel32.GetStdHandle(-11)
是获取stdout
的句柄。然后通过ctypes.windll.kernel32.SetConsoleTextAttribute(句柄,颜色代码)
控制文字和背景颜色。
为了代码更好看,我们或许需要更好的封装这些函数。但这些都没必要,Python的哲学就是别造重复的轮子
。
Colorama
只需要pip install colorama
,就可以使用封装好的跨平台命令行颜色控制库。
可用格式参数如下
- Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.
- Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.
- Style: DIM, NORMAL, BRIGHT, RESET_ALL
在Github上给的样例如下
from colorama import Fore, Back, Style
print(Fore.RED + 'some red text')
print(Back.GREEN + 'and with a green background')
print(Style.DIM + 'and in dim text')
print(Style.RESET_ALL)
print('back to normal now')
可以在代码前加以下两行让Python的print支持ASNI代码来控制任意平台的输出颜色
from colorama import init
init()
需要自动回复字体颜色还可以这样
from colorama import init
init(autoreset=True)
就无须手动恢复字体颜色了。