表格

Rich 的 Table 类提供了多种方法将表格数据渲染到终端。

要渲染表格,请构造一个 Table 对象,使用 add_column() 添加列,使用 add_row() 添加行 - 然后将其打印到控制台。

以下是一个示例

from rich.console import Console
from rich.table import Table

table = Table(title="Star Wars Movies")

table.add_column("Released", justify="right", style="cyan", no_wrap=True)
table.add_column("Title", style="magenta")
table.add_column("Box Office", justify="right", style="green")

table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690")
table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347")
table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889")
table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889")

console = Console()
console.print(table)

这将产生以下输出

                           Star Wars Movies                           
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃     Released  Title                                  Box Office ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ Dec 20, 2019  Star Wars: The Rise of Skywalker     $952,110,690 │
│ May 25, 2018  Solo: A Star Wars Story              $393,151,347 │
│ Dec 15, 2017  Star Wars Ep. V111: The Last Jedi  $1,332,539,889 │
│ Dec 16, 2016  Rogue One: A Star Wars Story       $1,332,439,889 │
└──────────────┴───────────────────────────────────┴────────────────┘

Rich 将计算出最佳列大小以适应您的内容,如果终端宽度不足以容纳内容,它将自动换行文字。

注意

您不限于在 add_row 方法中添加文本。您可以添加 Rich 能够渲染的任何内容(包括另一个表格)。

表格选项

在 Table 构造函数中,您可以使用一些关键字参数来定义表格的样式。

  • title 设置表格标题(显示在表格上方的文本)。

  • caption 设置表格标题(显示在表格下方的文本)。

  • width 设置表格的所需宽度(禁用自动宽度计算)。

  • min_width 设置表格的最小宽度。

  • box 设置表格网格的 Box 样式之一,或设置为 None 以不显示网格。

  • safe_box 设置为 True 以强制表格生成 ASCII 字符而不是 Unicode。

  • padding 一个整数,或 1、2 或 4 个值的元组,用于设置单元格的填充。

  • collapse_padding 如果为 True,将合并相邻单元格的填充。

  • pad_edge 设置为 False 以删除表格边缘周围的填充。

  • expand 设置为 True 以将表格扩展到可用大小。

  • show_header 设置为 True 以显示标题,False 以禁用标题。

  • show_footer 设置为 True 以显示脚注,False 以禁用脚注。

  • show_edge 设置为 False 以禁用表格周围的边框。

  • show_lines 设置为 True 以显示行之间的线以及标题/脚注。

  • leading 行之间的额外空格。

  • style 应用于整个表格的样式,例如“on blue”。

  • row_styles 设置为样式列表以对交替行进行样式设置。例如 ["dim", ""] 以创建斑马条纹

  • header_style 设置标题的默认样式。

  • footer_style 设置脚注的默认样式。

  • border_style 设置边框字符的样式。

  • title_style 设置标题的样式。

  • caption_style 设置标题的样式。

  • title_justify 设置标题对齐方式(“left”、“right”、“center” 或 “full”)。

  • caption_justify 设置标题对齐方式(“left”、“right”、“center” 或 “full”)。

  • highlight 设置为 True 以启用对单元格内容的自动突出显示。

边框样式

您可以通过导入预设的 Box 对象之一并在表格构造函数中设置 box 参数来设置边框样式。以下是一个修改星球大战表格外观的示例

from rich import box
table = Table(title="Star Wars Movies", box=box.MINIMAL_DOUBLE_HEAD)

请参阅 Box 以查看其他边框样式。

您也可以设置 box=None 以完全删除边框。

Table 类提供了许多配置选项来设置表格的外观,包括如何渲染边框以及列的样式和对齐方式。

线条

默认情况下,表格将在标题下方显示一条线。如果您想在所有行之间显示线,请在构造函数中添加 show_lines=True

您还可以通过在调用 add_row() 时设置 end_section=True,或通过调用 add_section() 来在当前行和后续行之间添加一条线,来强制在下一行显示一条线。

空表格

打印一个没有列的表格将产生一个空白行。如果您正在动态构建表格,并且数据源没有列,您可能想打印其他内容。以下是如何操作:

if table.columns:
    print(table)
else:
    print("[i]No data...[/i]")

添加列

您也可以通过在 Table 构造函数的位置参数中指定列来添加列。例如,我们可以构造一个包含三个列的表格,如下所示:

table = Table("Released", "Title", "Box Office", title="Star Wars Movies")

这允许您仅指定列的文本。如果您想设置其他属性,例如宽度和样式,则可以添加 Column 类。以下是一个示例

from rich.table import Column, Table
table = Table(
    "Released",
    "Title",
    Column(header="Box Office", justify="right"),
    title="Star Wars Movies"
)

列选项

您可以设置列上的许多选项来修改其外观。

  • header_style 设置标题的样式,例如“bold magenta”。

  • footer_style 设置脚注的样式。

  • style 设置应用于列的样式。您可以使用它通过设置背景为“on green”来突出显示列,例如。

  • justify 设置文本对齐方式为“left”、“center”、“right” 或 “full” 之一。

  • vertical 设置列中单元格的垂直对齐方式,为“top”、“middle” 或 “bottom” 之一。

  • width 明确将行的宽度设置为给定的字符数(禁用自动计算)。

  • min_width 设置为整数时,将阻止列缩小到此值以下。

  • max_width 设置为整数时,将阻止列扩展到此值以上。

  • ratio 定义一个比率来设置列宽度。例如,如果有 3 列,总比率为 6,并且 ratio=2,则该列将占用可用大小的三分之一。

  • no_wrap 设置为 True 以阻止此列换行。

垂直对齐

您可以通过设置列的 vertical 参数来定义列的垂直对齐方式。您也可以通过将文本或可渲染对象包装在 Align 类中来实现。

table.add_row(Align("Title", vertical="middle"))

网格

Table 类也可以成为一个很好的布局工具。如果您禁用标题和边框,您可以使用它在终端中定位内容。备用构造函数 grid() 可以为您创建一个这样的表格。

例如,以下代码显示两段文本,分别对齐到终端的左右边缘。

from rich import print
from rich.table import Table

grid = Table.grid(expand=True)
grid.add_column()
grid.add_column(justify="right")
grid.add_row("Raising shields", "[bold magenta]COMPLETED [green]:heavy_check_mark:")

print(grid)