如何在 Python 的终端中打印彩色文本?

如何在 Python 中将彩色文本输出到终端?代表实体块的最佳 Unicode 符号是什么?

答案

这在某种程度上取决于您所使用的平台。最常见的方法是打印 ANSI 转义序列。对于一个简单的示例,这是Blender 构建脚本中的一些 python 代码:

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

要使用这样的代码,您可以执行以下操作

print(bcolors.WARNING + "Warning: No active frommets remain. Continue?" + bcolors.ENDC)

或者,使用 Python3.6 +:

print(f"{bcolors.WARNING}Warning: No active frommets remain. Continue?{bcolors.ENDC}")

这将在包括 OS X,Linux 和 Windows 的 Unix 上运行(前提是您使用ANSICON ,或者在 Windows 10 中启用VT100 仿真 )。有用于设置颜色,移动光标等的 ansi 代码。

如果您对此感到复杂(听起来就像是在编写游戏),则应该查看 “curses” 模块,该模块为您处理了许多复杂的部分。 Python Curses HowTO是一个很好的介绍。

如果您没有使用扩展的 ASCII 码(即不在 PC 上),那么您将只能使用 127 以下的 ASCII 字符,而 “#” 或 “@” 可能是您最好的选择。如果可以确保您的终端使用的是 IBM 扩展的 ascii 字符集 ,那么您还有更多选择。字符 176、177、178 和 219 是 “块字符”。

一些现代的基于文本的程序,例如 “矮人要塞”,以图形模式模拟文本模式,并使用经典 PC 字体的图像。您可以在Dwarf Fortress Wiki see( 用户制作的 tileset )上找到一些可以使用的位图。

文本模式演示比赛有更多资源可以在文本模式下制作图形。

嗯.. 我认为这个答案有点过头了。不过,我正在计划一个史诗般的基于文本的冒险游戏。祝您彩色文字好运!

我很惊讶没有人提到Python termcolor 模块 。用法很简单:

from termcolor import colored

print colored('hello', 'red'), colored('world', 'green')

或在 Python 3 中:

print(colored('hello', 'red'), colored('world', 'green'))

但是,对于游戏编程和您要执行的 “彩色块” 来说,它可能不够复杂...

答案是Colorama,用于 Python 中的所有跨平台着色。

Python 3.6 示例屏幕截图: 屏幕截图示例

打印一个以颜色 / 样式开头的字符串,然后打印该字符串,然后以'\x1b[0m'结尾颜色 / 样式更改:

print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')

成功的绿色背景示例

使用以下代码获取外壳程序文本的格式选项表:

def print_format_table():
    """
    prints table of formatted text format options
    """
    for style in range(8):
        for fg in range(30,38):
            s1 = ''
            for bg in range(40,48):
                format = ';'.join([str(style), str(fg), str(bg)])
                s1 += '\x1b[%sm %s \x1b[0m' % (format, format)
            print(s1)
        print('\n')

print_format_table()

浅色示例(完整)

在此处输入图片说明

暗光示例(部分)

输出的顶部

定义一个以颜色开头的字符串和一个以颜色结尾的字符串,然后打印您的文本,其中开头的字符串在前面,结尾的字符串在结尾。

CRED = '\033[91m'
CEND = '\033[0m'
print(CRED + "Error, does not compute!" + CEND)

这会在urxvt使用 Zenburn 风格的配色方案在bash产生以下内容:

输出颜色

通过实验,我们可以获得更多的颜色:

颜色矩阵

注意: \33[5m\33[6m闪烁。

这样,我们可以创建完整的颜色集合:

CEND      = '\33[0m'
CBOLD     = '\33[1m'
CITALIC   = '\33[3m'
CURL      = '\33[4m'
CBLINK    = '\33[5m'
CBLINK2   = '\33[6m'
CSELECTED = '\33[7m'

CBLACK  = '\33[30m'
CRED    = '\33[31m'
CGREEN  = '\33[32m'
CYELLOW = '\33[33m'
CBLUE   = '\33[34m'
CVIOLET = '\33[35m'
CBEIGE  = '\33[36m'
CWHITE  = '\33[37m'

CBLACKBG  = '\33[40m'
CREDBG    = '\33[41m'
CGREENBG  = '\33[42m'
CYELLOWBG = '\33[43m'
CBLUEBG   = '\33[44m'
CVIOLETBG = '\33[45m'
CBEIGEBG  = '\33[46m'
CWHITEBG  = '\33[47m'

CGREY    = '\33[90m'
CRED2    = '\33[91m'
CGREEN2  = '\33[92m'
CYELLOW2 = '\33[93m'
CBLUE2   = '\33[94m'
CVIOLET2 = '\33[95m'
CBEIGE2  = '\33[96m'
CWHITE2  = '\33[97m'

CGREYBG    = '\33[100m'
CREDBG2    = '\33[101m'
CGREENBG2  = '\33[102m'
CYELLOWBG2 = '\33[103m'
CBLUEBG2   = '\33[104m'
CVIOLETBG2 = '\33[105m'
CBEIGEBG2  = '\33[106m'
CWHITEBG2  = '\33[107m'

这是生成测试的代码:

x = 0
for i in range(24):
  colors = ""
  for j in range(5):
    code = str(x+j)
    colors = colors + "\33[" + code + "m\\33[" + code + "m\033[0m "
  print(colors)
  x=x+5

您想了解 ANSI 转义序列。这是一个简单的示例:

CSI="\x1B["
print(CSI+"31;40m" + "Colored Text" + CSI + "0m")

有关更多信息,请参见http://en.wikipedia.org/wiki/ANSI_escape_code

对于块字符,请尝试使用 \ u2588 这样的 Unicode 字符:

print(u"\u2588")

放在一起:

print(CSI+"31;40m" + u"\u2588" + CSI + "0m")

我最喜欢的方法是使用Blessings库(完整披露:我写了它)。例如:

from blessings import Terminal

t = Terminal()
print t.red('This is red.')
print t.bold_bright_red_on_black('Bright red on black')

要打印彩色砖,最可靠的方法是使用背景色打印空间。我用这种技术绘制了鼻子渐进式的进度条

print t.on_green(' ')

您也可以在特定位置打印:

with t.location(0, 5):
    print t.on_yellow(' ')

如果您在游戏过程中不得不考虑其他终端功能,也可以这样做。您可以使用 Python 的标准字符串格式来保持可读性:

print '{t.clear_eol}You just cleared a {t.bold}whole{t.normal} line!'.format(t=t)

Blessings 的好处在于,它可以在各种终端上工作,而不仅仅是 ANSI 彩色终端(绝大多数)。它还在使代码简洁明了的同时,将无法读取的转义序列保留在代码之外。玩得开心!

sty与 colorama 相似,但较为冗长,支持8 位24 位 (rgb)颜色,允许您注册自己的样式,支持静音,非常灵活,文档丰富,并且更多。

例子:

from sty import fg, bg, ef, rs

foo = fg.red + 'This is red text!' + fg.rs
bar = bg.blue + 'This has a blue background!' + bg.rs
baz = ef.italic + 'This is italic text' + rs.italic
qux = fg(201) + 'This is pink text using 8bit colors' + fg.rs
qui = fg(255, 10, 10) + 'This is red text using 24bit colors.' + fg.rs

# Add custom colors:

from sty import Style, RgbFg

fg.orange = Style(RgbFg(255, 150, 50))

buf = fg.orange + 'Yay, Im orange.' + fg.rs

print(foo, bar, baz, qux, qui, buf, sep='\n')

印刷品:

在此处输入图片说明

演示: 在此处输入图片说明

生成一个具有所有颜色的类,并使用 for 循环将每种颜色的组合最多迭代到 100,然后编写一个具有 python 颜色的类。请按我的意愿复制并粘贴 GPLv2:

class colors:
    '''Colors class:
    reset all colors with colors.reset
    two subclasses fg for foreground and bg for background.
    use as colors.subclass.colorname.
    i.e. colors.fg.red or colors.bg.green
    also, the generic bold, disable, underline, reverse, strikethrough,
    and invisible work with the main class
    i.e. colors.bold
    '''
    reset='\033[0m'
    bold='\033[01m'
    disable='\033[02m'
    underline='\033[04m'
    reverse='\033[07m'
    strikethrough='\033[09m'
    invisible='\033[08m'
    class fg:
        black='\033[30m'
        red='\033[31m'
        green='\033[32m'
        orange='\033[33m'
        blue='\033[34m'
        purple='\033[35m'
        cyan='\033[36m'
        lightgrey='\033[37m'
        darkgrey='\033[90m'
        lightred='\033[91m'
        lightgreen='\033[92m'
        yellow='\033[93m'
        lightblue='\033[94m'
        pink='\033[95m'
        lightcyan='\033[96m'
    class bg:
        black='\033[40m'
        red='\033[41m'
        green='\033[42m'
        orange='\033[43m'
        blue='\033[44m'
        purple='\033[45m'
        cyan='\033[46m'
        lightgrey='\033[47m'

试试这个简单的代码

def prRed(prt): print("\033[91m {}\033[00m" .format(prt))
def prGreen(prt): print("\033[92m {}\033[00m" .format(prt))
def prYellow(prt): print("\033[93m {}\033[00m" .format(prt))
def prLightPurple(prt): print("\033[94m {}\033[00m" .format(prt))
def prPurple(prt): print("\033[95m {}\033[00m" .format(prt))
def prCyan(prt): print("\033[96m {}\033[00m" .format(prt))
def prLightGray(prt): print("\033[97m {}\033[00m" .format(prt))
def prBlack(prt): print("\033[98m {}\033[00m" .format(prt))

prGreen("Hello world")