样式

在 Rich API 的各个地方,您可以设置一个“样式”,它定义了文本的颜色以及粗体、斜体等各种属性。样式可以用包含*样式定义*的字符串给出,也可以用 Style 类实例给出。

定义样式

样式定义是一个包含一个或多个单词的字符串,用于设置颜色和属性。

要指定前景色,请使用 256 种 标准颜色 之一。例如,要打印以洋红色显示的“Hello”,请执行以下操作

console.print("Hello", style="magenta")

您也可以使用颜色的编号(介于 0 和 255 之间的整数),语法为 "color(<number>)"。以下将给出等效的输出

console.print("Hello", style="color(5)")

或者,您可以使用类似 CSS 的语法,用“#”后跟三个十六进制字符对来指定颜色,或者以 RGB 格式使用三个十进制整数。以下两行都打印以相同颜色(紫色)显示的“Hello”

console.print("Hello", style="#af00ff")
console.print("Hello", style="rgb(175,0,255)")

十六进制和 rgb 形式允许您从完整的*真彩色*集(1670 万种颜色)中进行选择。

注意

某些终端只支持 256 种颜色。如果您的颜色不可用,Rich 会尝试选择最接近的颜色。

本身,颜色会改变*前景色*。要指定*背景色*,请在颜色之前加上“on”。例如,以下打印以红色显示的文本,背景为白色

console.print("DANGER!", style="red on white")

您也可以使用 "default" 这个词来设置颜色,它会将颜色重置为终端软件管理的默认颜色。这对背景也适用,因此 "default on default" 的样式就是您的终端开始时的样式。

您可以通过添加以下一个或多个词来设置样式属性

  • "bold""b" 用于粗体文本。

  • "blink" 用于闪烁的文本(谨慎使用此样式)。

  • "blink2" 用于快速闪烁的文本(大多数终端不支持)。

  • "conceal" 用于*隐藏*的文本(大多数终端不支持)。

  • "italic""i" 用于斜体文本(Windows 上不支持)。

  • "reverse""r" 用于前景色和背景色反转的文本。

  • "strike""s" 用于带有删除线的文本。

  • "underline""u" 用于带下划线的文本。

Rich 还支持以下样式,它们的支持度不高,可能无法在您的终端中显示

  • "underline2""uu" 用于双下划线的文本。

  • "frame" 用于带边框的文本。

  • "encircle" 用于带圆圈的文本。

  • "overline""o" 用于带横线的文本。

样式属性和颜色可以组合使用。例如

console.print("Danger, Will Robinson!", style="blink bold red underline on white")

通过在属性前面加上“not”这个词可以否定样式。如果样式重叠,可以使用它来关闭样式。例如

console.print("foo [not bold]bar[/not bold] baz", style="bold")

这将打印以粗体显示的“foo”和“baz”,但“bar”将以普通文本显示。

样式还可以具有 "link" 属性,它会将任何带样式的文本转换为*超链接*(如果您的终端软件支持)。

要向样式添加链接,定义应包含 "link" 这个词,后跟一个 URL。以下示例将创建一个可点击的链接

console.print("Google", style="link https://google.com")

注意

如果您熟悉 HTML,您可能会发现以这种方式应用链接有点奇怪,但终端认为链接是另一种属性,就像粗体、斜体等。

样式类

最终,样式定义将被解析,并创建一个 Style 类的实例。如果您愿意,可以使用 Style 类来代替样式定义。以下是一个示例

from rich.style import Style
danger_style = Style(color="red", blink=True, bold=True)
console.print("Danger, Will Robinson!", style=danger_style)

以这种方式构建 Style 类稍微快一些,因为解析样式定义需要一些时间 - 但只在第一次调用时,因为 Rich 会缓存解析过的样式定义。

样式可以通过将它们加在一起进行组合,这在您想要修改现有样式的属性时非常有用。以下是一个示例

from rich.console import Console
from rich.style import Style
console = Console()

base_style = Style.parse("cyan")
console.print("Hello, World", style = base_style + Style(underline=True))

您可以使用 parse() 方法显式地解析样式定义,该方法接受样式定义并返回一个 Style 实例。例如,以下两行是等效的

style = Style(color="magenta", bgcolor="yellow", italic=True)
style = Style.parse("italic magenta on yellow")

样式主题

如果您重复使用样式,那么如果您想修改属性或颜色,这将是一场维护噩梦 - 您必须更改每个使用该样式的行。Rich 提供了一个 Theme 类,您可以用它来定义自定义样式,您可以按名称引用这些样式。这样,您只需要在一个地方更新样式即可。

样式主题可以使您的代码更具语义性,例如名为 "warning" 的样式比 "italic magenta underline" 更好地表达了意图。

要使用样式主题,请构建一个 Theme 实例,并将其传递给 Console 构造函数。以下是一个示例

from rich.console import Console
from rich.theme import Theme
custom_theme = Theme({
    "info": "dim cyan",
    "warning": "magenta",
    "danger": "bold red"
})
console = Console(theme=custom_theme)
console.print("This is information", style="info")
console.print("[warning]The pod bay doors are locked[/warning]")
console.print("Something terrible happened!", style="danger")

注意

样式名称必须为小写,以字母开头,并且只能包含字母或字符 ".""-""_"

自定义默认值

Theme 类将继承 Rich 内置的默认样式。如果您的自定义主题包含现有样式的名称,它将替换它。这允许您像创建自己的样式一样轻松地自定义默认值。例如,以下是如何更改 Rich 高亮显示数字的方式

from rich.console import Console
from rich.theme import Theme
console = Console(theme=Theme({"repr.number": "bold green blink"}))
console.print("The total is 128")

您可以通过在 rich.theme.Theme 构造函数上设置 inherit=False 来禁用继承默认主题。

要查看默认主题,请运行以下命令

python -m rich.theme
python -m rich.default_styles

加载主题

如果您愿意,您可以将样式写入外部配置文件,而不是在 Python 中写入。以下是一个格式示例

[styles]
info = dim cyan
warning = magenta
danger = bold red

您可以使用 read() 方法读取这些文件。