如何将彩色文本打印到终端?
- 2024-11-19 08:39:00
- admin 原创
- 9
问题描述:
如何在 Python 中向终端输出彩色文本?
解决方案 1:
这在某种程度上取决于您使用的平台。最常见的方法是打印 ANSI 转义序列。举一个简单的例子,以下是来自Blender 构建脚本的一些 Python 代码:
class bcolors:
HEADER = '[95m'
OKBLUE = '[94m'
OKCYAN = '[96m'
OKGREEN = '[92m'
WARNING = '[93m'
FAIL = '[91m'
ENDC = '[0m'
BOLD = '[1m'
UNDERLINE = '[4m'
要使用这样的代码,您可以执行以下操作:
print(bcolors.WARNING + "Warning: No active frommets remain. Continue?" + bcolors.ENDC)
或者,使用 Python 3.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 字体的图像。您可以在“矮人要塞” Wiki上找到一些可以使用的位图(用户制作的图块集)。
文本模式演示大赛有更多在文本模式下制作图形的资源。
解决方案 2:
还有Python termcolor 模块。使用非常简单:
from termcolor import colored
print(colored('hello', 'red'), colored('world', 'green'))
然而,对于游戏编程和您想要做的“彩色块”来说,它可能不够复杂......
要使 ANSI 代码在 Windows 上运行,首先运行
os.system('color')
解决方案 3:
答案是Colorama,适用于 Python 中所有跨平台的着色。
它支持 Python 3.5+ 以及 Python 2.7。
并且自 2023 年 1 月起,该政策仍维持有效。
示例代码:
from colorama import init as colorama_init
from colorama import Fore
from colorama import Style
colorama_init()
print(f"This is {Fore.GREEN}color{Style.RESET_ALL}!")
示例截图:
解决方案 4:
打印一个以颜色/样式为开头的字符串,然后打印该字符串,最后打印以颜色/样式更改结尾的字符串'x1b[0m'
:
print('x1b[6;30;42m' + 'Success!' + 'x1b[0m')
使用以下代码获取 shell 文本的格式选项表:
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('
')
print_format_table()
明暗对比示例(完整)
明暗对比示例(部分)
参考:https ://en.wikipedia.org/wiki/ANSI_escape_code#Colors
解决方案 5:
定义一个开始颜色的字符串和一个结束颜色的字符串。然后以开始字符串在前面、结束字符串在后面的方式打印文本。
CRED = '[91m'
CEND = '[0m'
print(CRED + "Error, does not compute!" + CEND)
这会在 Bash 中产生以下内容,并采用urxvt
Zenburn 风格的配色方案:
通过实验,我们可以获得更多的颜色:
注意:[5m
和[6m
正在闪烁。
这样我们就可以创建一个全彩色的集合:
CEND = '[0m'
CBOLD = '[1m'
CITALIC = '[3m'
CURL = '[4m'
CBLINK = '[5m'
CBLINK2 = '[6m'
CSELECTED = '[7m'
CBLACK = '[30m'
CRED = '[31m'
CGREEN = '[32m'
CYELLOW = '[33m'
CBLUE = '[34m'
CVIOLET = '[35m'
CBEIGE = '[36m'
CWHITE = '[37m'
CBLACKBG = '[40m'
CREDBG = '[41m'
CGREENBG = '[42m'
CYELLOWBG = '[43m'
CBLUEBG = '[44m'
CVIOLETBG = '[45m'
CBEIGEBG = '[46m'
CWHITEBG = '[47m'
CGREY = '[90m'
CRED2 = '[91m'
CGREEN2 = '[92m'
CYELLOW2 = '[93m'
CBLUE2 = '[94m'
CVIOLET2 = '[95m'
CBEIGE2 = '[96m'
CWHITE2 = '[97m'
CGREYBG = '[100m'
CREDBG2 = '[101m'
CGREENBG2 = '[102m'
CYELLOWBG2 = '[103m'
CBLUEBG2 = '[104m'
CVIOLETBG2 = '[105m'
CBEIGEBG2 = '[106m'
CWHITEBG2 = '[107m'
以下是生成测试的代码:
x = 0
for i in range(24):
colors = ""
for j in range(5):
code = str(x+j)
colors = colors + "[" + code + "m\\33[" + code + "m[0m "
print(colors)
x = x + 5
解决方案 6:
这是一个适用于 Windows 10 的解决方案。
使用系统调用(例如os.system("")
)允许在命令提示符和 Powershell 中本地打印颜色:
import os
# System call
os.system("")
# Class of different styles
class style():
BLACK = '[30m'
RED = '[31m'
GREEN = '[32m'
YELLOW = '[33m'
BLUE = '[34m'
MAGENTA = '[35m'
CYAN = '[36m'
WHITE = '[37m'
UNDERLINE = '[4m'
RESET = '[0m'
print(style.YELLOW + "Hello, World!")
注意:Windows 不完全支持 ANSI 代码,无论是通过系统调用还是模块。并非所有文本装饰都受支持,尽管可以显示明亮的颜色,但它们与常规颜色相同。
感谢@jl 找到了一种更短的方法。
总结:添加os.system("")
解决方案 7:
您想了解 ANSI 转义序列。以下是一个简单的示例:
CSI = "x1B["
print(CSI+"31;40m" + "Colored Text" + CSI + "0m")
有关更多信息,请参阅ANSI 转义代码。
对于块字符,请尝试使用 Unicode 字符,例如 /u2588:
print(u"/u2588")
综合起来:
print(CSI+"31;40m" + u"/u2588" + CSI + "0m")
解决方案 8:
sty与 colorama 类似,但更简洁,支持8 位和24 位(RGB)颜色,支持所有效果(粗体、下划线等),允许您注册自己的样式,完全类型化且性能高,支持静音,不会干扰全局变量sys.stdout
,非常灵活,有详尽的文档等等......
例子:
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='
')
印刷:
演示:
解决方案 9:
Rich是一个相对较新的 Python 库,用于在终端中处理颜色。
在 Rich 中有几种使用颜色的方法。最快的入门方法是使用 rich print 方法,该方法将类似BBCode的语法呈现为 ANSI 控制代码:
from rich import print
print("[red]Color[/] in the [bold magenta]Terminal[/]!")
还有其他方法可以使用 Rich(正则表达式、语法)和相关格式功能来应用颜色。
解决方案 10:
在我看来,这是最简单的方法。只要你有所需颜色的 RGB 值,就可以这样做:
def colored(r, g, b, text):
return f"[38;2;{r};{g};{b}m{text}[0m"
打印红色文本的示例:
text = 'Hello, World!'
colored_text = colored(255, 0, 0, text)
print(colored_text)
#or
print(colored(255, 0, 0, 'Hello, World!'))
多色文本
text = colored(255, 0, 0, 'Hello, ') + colored(0, 255, 0, 'World')
print(text)
解决方案 11:
我最喜欢的方式是使用Blessings库(坦白说:这是我写的)。例如:
from blessings import Terminal
t = Terminal()
print t.red('This is red.')
print t.bold_bright_red_on_black('Bright red on black')
要打印彩色砖块,最可靠的方法是打印具有背景颜色的空间。我使用这种技术在nose-progressive中绘制进度条:
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 彩色终端。它还能让代码中不出现难以阅读的转义序列,同时保持简洁易用。祝您玩得开心!
解决方案 12:
我使用循环迭代最多 100 种颜色的每种组合来生成一个包含所有颜色的类for
,然后编写了一个包含 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='[0m'
bold='[01m'
disable='[02m'
underline='[04m'
reverse='[07m'
strikethrough='[09m'
invisible='[08m'
class fg:
black='[30m'
red='[31m'
green='[32m'
orange='[33m'
blue='[34m'
purple='[35m'
cyan='[36m'
lightgrey='[37m'
darkgrey='[90m'
lightred='[91m'
lightgreen='[92m'
yellow='[93m'
lightblue='[94m'
pink='[95m'
lightcyan='[96m'
class bg:
black='[40m'
red='[41m'
green='[42m'
orange='[43m'
blue='[44m'
purple='[45m'
cyan='[46m'
lightgrey='[47m'
解决方案 13:
尝试这个简单的代码
def prRed(prt):
print(f"[91m{prt}[00m")
def prGreen(prt):
print(f"[92m{prt}[00m")
def prYellow(prt):
print(f"[93m{prt}[00m")
def prLightPurple(prt):
print(f"[94m{prt}[00m")
def prPurple(prt):
print(f"[95m{prt}[00m")
def prCyan(prt):
print(f"[96m{prt}[00m")
def prLightGray(prt):
print(f"[97m{prt}[00m")
def prBlack(prt):
print(f"[98m{prt}[00m")
def prReset(prt):
print(f"[0m{prt}[00m")
prGreen("Hello, Green World!")
prBlack("Hello, Black World!")
prCyan("Hello, Cyan World!")
prGreen("Hello, Green World!")
prLightGray("Hello, Light Grey World!")
prLightPurple("Hello, Light Purple World!")
prPurple("Hello, Purple World!")
prRed("Hello, Red World!")
prYellow("Hello, Yellow World!")
prReset("Hello, Reset World!")
Python 3 示例
# python2
def prRed(prt): print("[91m {}[00m" .format(prt))
def prGreen(prt): print("[92m {}[00m" .format(prt))
def prYellow(prt): print("[93m {}[00m" .format(prt))
def prLightPurple(prt): print("[94m {}[00m" .format(prt))
def prPurple(prt): print("[95m {}[00m" .format(prt))
def prCyan(prt): print("[96m {}[00m" .format(prt))
def prLightGray(prt): print("[97m {}[00m" .format(prt))
def prBlack(prt): print("[98m {}[00m" .format(prt))
prGreen("Hello, World!")
解决方案 14:
# Pure Python 3.x demo, 256 colors
# Works with bash under Linux and MacOS
fg = lambda text, color: "[38;5;" + str(color) + "m" + text + "[0m"
bg = lambda text, color: "[48;5;" + str(color) + "m" + text + "[0m"
def print_six(row, format, end="
"):
for col in range(6):
color = row*6 + col - 2
if color>=0:
text = "{:3d}".format(color)
print (format(text,color), end=" ")
else:
print(end=" ") # four spaces
print(end=end)
for row in range(0, 43):
print_six(row, fg, " ")
print_six(row, bg)
# Simple usage: print(fg("text", 160))
在线尝试
解决方案 15:
我有一个名为 colorit 的库。它非常简单。
以下是一些示例:
from colorit import *
# Use this to ensure that ColorIt will be usable by certain command line interfaces
# Note: This clears the terminal
init_colorit()
# Foreground
print(color("This text is red", Colors.red))
print(color("This text is orange", Colors.orange))
print(color("This text is yellow", Colors.yellow))
print(color("This text is green", Colors.green))
print(color("This text is blue", Colors.blue))
print(color("This text is purple", Colors.purple))
print(color("This text is white", Colors.white))
# Background
print(background("This text has a background that is red", Colors.red))
print(background("This text has a background that is orange", Colors.orange))
print(background("This text has a background that is yellow", Colors.yellow))
print(background("This text has a background that is green", Colors.green))
print(background("This text has a background that is blue", Colors.blue))
print(background("This text has a background that is purple", Colors.purple))
print(background("This text has a background that is white", Colors.white))
# Custom
print(color("This color has a custom grey text color", (150, 150, 150)))
print(background("This color has a custom grey background", (150, 150, 150)))
# Combination
print(
background(
color("This text is blue with a white background", Colors.blue), Colors.white
)
)
# If you are using Windows Command Line, this is so that it doesn't close immediately
input()
这将为您提供:
还值得注意的是,这是跨平台的,已经在 Mac、Linux 和 Windows 上进行了测试。
你可能想尝试一下:https: //github.com/SuperMaZingCoder/colorit
colorit
现在可以使用 PyPi 安装!您可以pip install color-it
在 Windows、pip3 install color-it
macOS 和 Linux 上安装它。
解决方案 16:
在 Windows 上,您可以使用模块“win32console”(在某些 Python 发行版中可用)或模块“ctypes”(Python 2.5 及更高版本)来访问 Win32 API。
要查看支持两种方式的完整代码,请参阅Testoob的彩色控制台报告代码。
ctypes示例:
import ctypes
# Constants from the Windows API
STD_OUTPUT_HANDLE = -11
FOREGROUND_RED = 0x0004 # text color contains red.
def get_csbi_attributes(handle):
# Based on IPython's winconsole.py, written by Alexander Belchenko
import struct
csbi = ctypes.create_string_buffer(22)
res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(handle, csbi)
assert res
(bufx, bufy, curx, cury, wattr,
left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
return wattr
handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
reset = get_csbi_attributes(handle)
ctypes.windll.kernel32.SetConsoleTextAttribute(handle, FOREGROUND_RED)
print "Cherry on top"
ctypes.windll.kernel32.SetConsoleTextAttribute(handle, reset)
解决方案 17:
我将joeld 的答案包装到一个具有全局函数的模块中,可以在我的代码的任何地方使用它。
文件:log.py
def enable():
HEADER = '[95m'
OKBLUE = '[94m'
OKGREEN = '[92m'
WARNING = '[93m'
FAIL = '[91m'
ENDC = '[0m'
BOLD = "[1m"
def disable():
HEADER = ''
OKBLUE = ''
OKGREEN = ''
WARNING = ''
FAIL = ''
ENDC = ''
def infog(msg):
print(OKGREEN + msg + ENDC)
def info(msg):
print(OKBLUE + msg + ENDC)
def warn(msg):
print(WARNING + msg + ENDC)
def err(msg):
print(FAIL + msg + ENDC)
enable()
使用方法如下:
import log
log.info("Hello, World!")
log.err("System Error")
解决方案 18:
这是我的现代(2021)解决方案:yachalk
它是少数几个正确支持嵌套样式的库之一:
除此之外,yachalk 还具有自动完成功能、支持 256/真彩色、终端功能检测,并且完全输入。
以下是您在选择解决方案时可以考虑的一些设计决策。
高级库与低级库/手动样式处理?
该问题的许多答案都演示了如何直接对 ANSI 进行转义,或者建议需要手动启用/禁用样式的低级库。
这些方法存在一些微妙的问题:手动插入开/关样式
语法上更冗长,因为必须明确指定重置,
更容易出错,因为你可能会不小心忘记重置样式,
无法正确处理边缘情况:例如,在某些终端中,需要在换行符之前重置样式,并在换行符之后重新激活它们。此外,某些终端在简单地覆盖互斥样式时会遇到问题,并且需要插入“不必要的”重置代码。如果开发人员的本地终端没有这些怪癖,开发人员将不会立即发现这些怪癖。其他人只会在稍后报告该问题或导致问题,例如在 CI 终端上。
因此,如果目标是兼容多种终端,最好使用提供自动处理样式重置的高级库。这样,库就可以通过在需要的地方插入“虚假”的 ANSI 转义码来处理所有边缘情况。
为什么还要建一个图书馆?
在 JavaScript 中,该任务的实际标准库是Chalk,在 JS 项目中使用了一段时间后,Python 世界中可用的解决方案就显得不足了。Chalk API 不仅使用起来更方便(完全兼容自动完成),而且还能正确处理所有边缘情况。
yachalk的理念是为 Python 生态系统带来同样的便利。如果您有兴趣与其他库进行比较,我已经在项目页面上开始了功能比较。此外,这里有一个很长的(但仍不完整)的替代方案列表,这些替代方案是我在研究过程中提出的——有很多可供选择 :)
有色
安西科洛斯
术语颜色
科罗拉马
调色师
麦粒肿
祝福
富有的
卡洛利特
彩色印刷
控制台颜色
皮凡斯
颜色
style(以前称为 clr)
pychalk
简单的粉笔
奇尔克
白垩质
康斯泰尔
解决方案 19:
def black(text):
print('[30m', text, '[0m', sep='')
def red(text):
print('[31m', text, '[0m', sep='')
def green(text):
print('[32m', text, '[0m', sep='')
def yellow(text):
print('[33m', text, '[0m', sep='')
def blue(text):
print('[34m', text, '[0m', sep='')
def magenta(text):
print('[35m', text, '[0m', sep='')
def cyan(text):
print('[36m', text, '[0m', sep='')
def gray(text):
print('[90m', text, '[0m', sep='')
black("BLACK")
red("RED")
green("GREEN")
yellow("YELLOW")
blue("BLACK")
magenta("MAGENTA")
cyan("CYAN")
gray("GRAY")
在线试用
解决方案 20:
我最终这样做了,我觉得这是最干净的:
formatters = {
'RED': '[91m',
'GREEN': '[92m',
'END': '[0m',
}
print 'Master is currently {RED}red{END}!'.format(**formatters)
print 'Help make master {GREEN}green{END} again!'.format(**formatters)
解决方案 21:
对于 Windows,除非使用Win32 API,否则无法使用颜色打印到控制台。
对于 Linux 来说,它就像使用打印一样简单,转义序列概述如下:
颜色
要使字符打印成方框,实际上取决于控制台窗口使用的字体。磅号效果很好,但这取决于字体:
#
解决方案 22:
非常简单,基于joeld 的回答:
class PrintInColor:
RED = '[91m'
GREEN = '[92m'
YELLOW = '[93m'
LIGHT_PURPLE = '[94m'
PURPLE = '[95m'
END = '[0m'
@classmethod
def red(cls, s, **kwargs):
print(cls.RED + s + cls.END, **kwargs)
@classmethod
def green(cls, s, **kwargs):
print(cls.GREEN + s + cls.END, **kwargs)
@classmethod
def yellow(cls, s, **kwargs):
print(cls.YELLOW + s + cls.END, **kwargs)
@classmethod
def lightPurple(cls, s, **kwargs):
print(cls.LIGHT_PURPLE + s + cls.END, **kwargs)
@classmethod
def purple(cls, s, **kwargs):
print(cls.PURPLE + s + cls.END, **kwargs)
然后就
PrintInColor.red('hello', end=' ')
PrintInColor.green('world')
解决方案 23:
基于joeld 的回答,使用https://pypi.python.org/pypi/lazyme
pip install -U lazyme
:
from lazyme.string import color_print
>>> color_print('abc')
abc
>>> color_print('abc', color='pink')
abc
>>> color_print('abc', color='red')
abc
>>> color_print('abc', color='yellow')
abc
>>> color_print('abc', color='green')
abc
>>> color_print('abc', color='blue', underline=True)
abc
>>> color_print('abc', color='blue', underline=True, bold=True)
abc
>>> color_print('abc', color='pink', underline=True, bold=True)
abc
截屏:
使用新格式化程序进行了一些更新color_print
,例如:
>>> from lazyme.string import palette, highlighter, formatter
>>> from lazyme.string import color_print
>>> palette.keys() # Available colors.
['pink', 'yellow', 'cyan', 'magenta', 'blue', 'gray', 'default', 'black', 'green', 'white', 'red']
>>> highlighter.keys() # Available highlights.
['blue', 'pink', 'gray', 'black', 'yellow', 'cyan', 'green', 'magenta', 'white', 'red']
>>> formatter.keys() # Available formatter,
['hide', 'bold', 'italic', 'default', 'fast_blinking', 'faint', 'strikethrough', 'underline', 'blinking', 'reverse']
注意:italic
、fast blinking
和strikethrough
可能无法在所有终端上运行,并且它们无法在 Mac 和 Ubuntu 上运行。
例如,
>>> color_print('foo bar', color='pink', highlight='white')
foo bar
>>> color_print('foo bar', color='pink', highlight='white', reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', bold=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True, reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', underline=True, reverse=True)
foo bar
截屏:
解决方案 24:
with
请注意关键字与需要重置的修饰符混合得如何好(使用 Python 3 和 Colorama):
from colorama import Fore, Style
import sys
class Highlight:
def __init__(self, clazz, color):
self.color = color
self.clazz = clazz
def __enter__(self):
print(self.color, end="")
def __exit__(self, type, value, traceback):
if self.clazz == Fore:
print(Fore.RESET, end="")
else:
assert self.clazz == Style
print(Style.RESET_ALL, end="")
sys.stdout.flush()
with Highlight(Fore, Fore.GREEN):
print("this is highlighted")
print("this is not")
解决方案 25:
您可以使用Clint:
from clint.textui import colored
print colored.red('some warning message')
print colored.green('nicely done!')
解决方案 26:
您可以使用curses库的 Python 实现:
curses — 用于字符单元显示的终端处理
另外,运行这个你就会找到你的盒子:
for i in range(255):
print i, chr(i)
解决方案 27:
表情符号
您可以像其他人在答案中提到的那样,对文本使用颜色,以获得具有背景色或前景色的彩色文本。
但是你可以使用表情符号来代替!例如,你可以使用它⚠️
来表示警告消息和`
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件