有时候我们想要用不同色彩的文字来区分下,但是在Windows上不同于Mac或Linux,无法使用\033的方法,那怎么办呢?这里我们将对Windows下命令行输出彩色文字进行分析。
首先我们来看一段代码,品味下是怎么生成彩色的:
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) def set_cmd_text_color(color, handle=std_out_handle): Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color) return Bool
这一块是和Windows的编程特性有关,我们不深入进去,有兴趣自查资料。
我们已经看到,定义了一个『set_cmd_text_color』函数:
set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
这个函数支持2位十六进制编码,比如0x12,0x03,0xef。取值都是0~f。区别在于,前一位指的是背景色,后一位指的是前景色,我们为了方便,可以给这些颜色编码定义一些有意义的别名。比如:
# Windows CMD命令行 字体颜色定义 text colors FOREGROUND_BLACK = 0x00 # black. FOREGROUND_DARKBLUE = 0x01 # dark blue. FOREGROUND_DARKGREEN = 0x02 # dark green. FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue. FOREGROUND_DARKRED = 0x04 # dark red. FOREGROUND_DARKPINK = 0x05 # dark pink. FOREGROUND_DARKYELLOW = 0x06 # dark yellow. FOREGROUND_DARKWHITE = 0x07 # dark white. FOREGROUND_DARKGRAY = 0x08 # dark gray. FOREGROUND_BLUE = 0x09 # blue. FOREGROUND_GREEN = 0x0a # green. FOREGROUND_SKYBLUE = 0x0b # skyblue. FOREGROUND_RED = 0x0c # red. FOREGROUND_PINK = 0x0d # pink. FOREGROUND_YELLOW = 0x0e # yellow. FOREGROUND_WHITE = 0x0f # white. # Windows CMD命令行 背景颜色定义 background colors BACKGROUND_BLUE = 0x10 # dark blue. BACKGROUND_GREEN = 0x20 # dark green. BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue. BACKGROUND_DARKRED = 0x40 # dark red. BACKGROUND_DARKPINK = 0x50 # dark pink. BACKGROUND_DARKYELLOW = 0x60 # dark yellow. BACKGROUND_DARKWHITE = 0x70 # dark white. BACKGROUND_DARKGRAY = 0x80 # dark gray. BACKGROUND_BLUE = 0x90 # blue. BACKGROUND_GREEN = 0xa0 # green. BACKGROUND_SKYBLUE = 0xb0 # skyblue. BACKGROUND_RED = 0xc0 # red. BACKGROUND_PINK = 0xd0 # pink. BACKGROUND_YELLOW = 0xe0 # yellow. BACKGROUND_WHITE = 0xf0 # white.
我们可以把每种颜色代码都封装成了易用的函数,可以根据需要在自己的脚本里直接导入相应函数进行彩色输出。
比如原来是 print 'hello' 现在直接 printBlue('hello') 就可以了。
#coding=utf-8 import ctypes import sys STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 STD_ERROR_HANDLE = -12 # 字体颜色定义 ,关键在于颜色编码,由2位十六进制组成,分别取0~f,前一位指的是背景色,后一位指的是字体色 #由于该函数的限制,应该是只有这16种,可以前景色与背景色组合。也可以几种颜色通过或运算组合,组合后还是在这16种颜色中 # Windows CMD命令行 字体颜色定义 text colors FOREGROUND_BLACK = 0x00 # black. FOREGROUND_DARKBLUE = 0x01 # dark blue. FOREGROUND_DARKGREEN = 0x02 # dark green. FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue. FOREGROUND_DARKRED = 0x04 # dark red. FOREGROUND_DARKPINK = 0x05 # dark pink. FOREGROUND_DARKYELLOW = 0x06 # dark yellow. FOREGROUND_DARKWHITE = 0x07 # dark white. FOREGROUND_DARKGRAY = 0x08 # dark gray. FOREGROUND_BLUE = 0x09 # blue. FOREGROUND_GREEN = 0x0a # green. FOREGROUND_SKYBLUE = 0x0b # skyblue. FOREGROUND_RED = 0x0c # red. FOREGROUND_PINK = 0x0d # pink. FOREGROUND_YELLOW = 0x0e # yellow. FOREGROUND_WHITE = 0x0f # white. # Windows CMD命令行 背景颜色定义 background colors BACKGROUND_BLUE = 0x10 # dark blue. BACKGROUND_GREEN = 0x20 # dark green. BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue. BACKGROUND_DARKRED = 0x40 # dark red. BACKGROUND_DARKPINK = 0x50 # dark pink. BACKGROUND_DARKYELLOW = 0x60 # dark yellow. BACKGROUND_DARKWHITE = 0x70 # dark white. BACKGROUND_DARKGRAY = 0x80 # dark gray. BACKGROUND_BLUE = 0x90 # blue. BACKGROUND_GREEN = 0xa0 # green. BACKGROUND_SKYBLUE = 0xb0 # skyblue. BACKGROUND_RED = 0xc0 # red. BACKGROUND_PINK = 0xd0 # pink. BACKGROUND_YELLOW = 0xe0 # yellow. BACKGROUND_WHITE = 0xf0 # white. std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) def set_cmd_text_color(color, handle=std_out_handle): Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color) return Bool #重置色彩 def resetColor(): set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) #暗蓝色 #dark blue def printDarkBlue(mess): set_cmd_text_color(FOREGROUND_DARKBLUE) sys.stdout.write(mess) resetColor() #暗绿色 #dark green def printDarkGreen(mess): set_cmd_text_color(FOREGROUND_DARKGREEN) sys.stdout.write(mess) resetColor() #暗天蓝色 #dark sky blue def printDarkSkyBlue(mess): set_cmd_text_color(FOREGROUND_DARKSKYBLUE) sys.stdout.write(mess) resetColor() #暗红色 #dark red def printDarkRed(mess): set_cmd_text_color(FOREGROUND_DARKRED) sys.stdout.write(mess) resetColor() #暗粉红色 #dark pink def printDarkPink(mess): set_cmd_text_color(FOREGROUND_DARKPINK) sys.stdout.write(mess) resetColor() #暗黄色 #dark yellow def printDarkYellow(mess): set_cmd_text_color(FOREGROUND_DARKYELLOW) sys.stdout.write(mess) resetColor() #暗白色 #dark white def printDarkWhite(mess): set_cmd_text_color(FOREGROUND_DARKWHITE) sys.stdout.write(mess) resetColor() #暗灰色 #dark gray def printDarkGray(mess): set_cmd_text_color(FOREGROUND_DARKGRAY) sys.stdout.write(mess) resetColor() #蓝色 #blue def printBlue(mess): set_cmd_text_color(FOREGROUND_BLUE) sys.stdout.write(mess) resetColor() #绿色 #green def printGreen(mess): set_cmd_text_color(FOREGROUND_GREEN) sys.stdout.write(mess) resetColor() #天蓝色 #sky blue def printSkyBlue(mess): set_cmd_text_color(FOREGROUND_SKYBLUE) sys.stdout.write(mess) resetColor() #红色 #red def printRed(mess): set_cmd_text_color(FOREGROUND_RED) sys.stdout.write(mess) resetColor() #粉红色 #pink def printPink(mess): set_cmd_text_color(FOREGROUND_PINK) sys.stdout.write(mess) resetColor() #黄色 #yellow def printYellow(mess): set_cmd_text_color(FOREGROUND_YELLOW) sys.stdout.write(mess) resetColor() #白色 #white def printWhite(mess): set_cmd_text_color(FOREGROUND_WHITE) sys.stdout.write(mess) resetColor() #白底黑字 #white bkground and black text def printWhiteBlack(mess): set_cmd_text_color(FOREGROUND_BLACK | BACKGROUND_WHITE) sys.stdout.write(mess) resetColor() #白底黑字 #white bkground and black text def printWhiteBlack_2(mess): set_cmd_text_color(0xf0) sys.stdout.write(mess) resetColor() #黄底蓝字 #white bkground and black text def printYellowRed(mess): set_cmd_text_color(BACKGROUND_YELLOW | FOREGROUND_RED) sys.stdout.write(mess) resetColor() if __name__ == '__main__': printDarkBlue('暗蓝色文字') # Python2.x下使用记得encode('gb2312')