发布时间 2023-09-13 12:59:54作者: linux星

Rich 的类提供了多种将表格数据呈现到终端的方法。

要呈现表,请构造一个对象,使用 添加列,用 添加行,然后将其打印到控制台。

下面是一个示例:

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 将计算适合您的内容的最佳列大小,如果终端宽度不足以容纳内容,则会换行文本以适合。

注意

您不限于在方法中添加文本。您可以添加 Rich 知道如何呈现的任何内容(包括另一个表)。add_row

表选项

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

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

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

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

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

  • box为表格网格设置一种 Box 样式,或者为无网格设置框样式之一。None

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

  • 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", ""]

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

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

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

  • title_style设置标题的样式。

  • caption_style设置字幕的样式。

  • title_justify设置标题对齐方法(“左”、“右”、“居中”或“完整”)

  • caption_justify设置标题对齐方法(“左”、“右”、“居中”或“完整”)

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

边框样式

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

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

有关其他框样式,请参阅

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

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

线

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

还可以通过在调用 上设置对 的调用,或通过调用 在当前行和后续行之间添加一行来强制下一行。end_section=True

空表

打印没有列的表会导致空行。如果要动态生成表,并且数据源没有列,则可能需要打印其他内容。您可以通过以下方式执行此操作:

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

添加列

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

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

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

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将文本对齐设置为“左”、“居中”、“右”或“完整”之一。

  • vertical将列中单元格的垂直对齐方式设置为“顶部”、“中间”或“底部”之一。

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

  • min_width设置为整数时将防止列缩小到此数量以下。

  • max_width当设置为整数时,将防止列增长超过此数量。

  • ratio定义用于设置列宽的比率。例如,如果有 3 列,总共 6 个比率,则该列将是可用大小的三分之一。ratio=2

  • no_wrap设置为 True 可防止此列换行。

垂直对齐

您可以通过设置列的参数来定义列的垂直对齐方式。您还可以通过包装文本或使用类呈现来按单元格执行此操作:vertical

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

网 格

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

例如,以下代码在一行上显示与终端的左边缘和右边缘对齐的两段文本:

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)