表格

里奇百货公司 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知道如何呈现的任何内容(包括另一个表)。

表选项

表构造函数上有许多关键字参数,可以用来定义表的外观。

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

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

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

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

  • 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 应用于整个表格的样式,例如“在蓝色上”

  • row_styles 设置为样式列表以设置交替行的样式。例如: ["dim", ""] 创造 zebra stripes

  • header_style 设置页眉的默认样式。

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

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

  • title_style 设置标题的样式。

  • caption_style 设置标题的样式。

  • title_justify 设置标题对齐方式(“左”、“右”、“中”或“全”)

  • caption_justify 设置字幕对齐方式(“左”、“右”、“中”或“全”)

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

边框样式

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

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

看见 用于其他方框样式。

您还可以设置 box=None 若要完全删除边框,请执行以下操作。

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

线条

默认情况下,表格将仅在标题下显示一行。如果要显示所有行之间的线条,请添加 show_lines=True 传递给构造函数。

还可以通过设置在下一行上强制行 end_section=True 在呼叫到 add_row() ,或通过调用 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 设置页眉的样式,例如“粗体洋红色”。

  • footer_style 设置页脚的样式。

  • style 设置应用于列的样式。例如,您可以通过将背景设置为“开绿色”来突出显示一列。

  • justify 将文本对齐设置为“Left”、“Center”、“Right”或“Full”之一。

  • vertical 将列中单元格的垂直对齐设置为“上”、“中”或“下”之一。

  • 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)