布局

发布时间 2023-09-13 13:05:00作者: linux星

Rich 提供了一个类,可用于将屏幕区域划分为多个部分,其中每个部分可能包含独立的内容。它可以与实时显示一起使用以创建全屏“应用程序”,但可以单独使用。

若要查看布局示例,请从命令行运行以下命令:

python -m rich.layout

创建布局

要定义布局,请构造布局对象并打印它:

from rich import print
from rich.layout import Layout

layout = Layout()
print(layout)

这将绘制一个终端大小的框,其中包含有关布局的一些信息。该框是一个“占位符”,因为我们尚未向其添加任何内容。在执行此操作之前,让我们通过调用将布局划分为两个子布局的方法创建一个更有趣的布局:

layout.split_column(
    Layout(name="upper"),
    Layout(name="lower")
)
print(layout)

这会将终端屏幕分成两个大小相等的部分,一个在另一个之上。该属性是一个内部标识符,我们稍后可以使用它来查找子布局。让我们使用它来创建另一个拆分,这次我们将调用将较低的布局拆分为一行两个子布局:name

layout["lower"].split_row(
    Layout(name="left"),
    Layout(name="right"),
)
print(layout)

您现在应该看到屏幕区域分为 3 个部分;上半部分和下半部分分为四分之二。

╭─────────────────────────────── 'upper' (84 x 13) ────────────────────────────────╮
│                                                                                  │
│                                                                                  │
│                                                                                  │
│                                                                                  │
│                                                                                  │
│          {'size': None, 'minimum_size': 1, 'ratio': 1, 'name': 'upper'}          │
│                                                                                  │
│                                                                                  │
│                                                                                  │
│                                                                                  │
│                                                                                  │
╰──────────────────────────────────────────────────────────────────────────────────╯
╭─────────── 'left' (42 x 14) ───────────╮╭────────── 'right' (42 x 14) ───────────╮
│                                        ││                                        │
│                                        ││                                        │
│                                        ││                                        │
│         {                              ││         {                              │
│             'size': None,              ││             'size': None,              │
│             'minimum_size': 1,         ││             'minimum_size': 1,         │
│             'ratio': 1,                ││             'ratio': 1,                │
│             'name': 'left'             ││             'name': 'right'            │
│         }                              ││         }                              │
│                                        ││                                        │
│                                        ││                                        │
│                                        ││                                        │
╰────────────────────────────────────────╯╰────────────────────────────────────────╯

您可以继续以这种方式调用 split() 以根据需要在屏幕上创建任意数量的部分。

设置可渲染量

第一个位置参数可以是任何 Rich 可呈现对象,其大小将适合布局的区域。以下是我们将“正确”布局分为两个面板的方法:Layout

from rich.panel import Panel

layout["right"].split(
    Layout(Panel("Hello")),
    Layout(Panel("World!"))
)

您还可以调用来设置或替换当前可渲染对象:

layout["left"].update(
    "The mystery of life isn't a problem to solve, but a reality to experience."
)
print(layout)

固定尺寸

可以通过在 Layout 构造函数上设置参数或设置属性,将布局设置为使用固定大小。下面是一个示例:size

layout["upper"].size = 10
print(layout)

这会将上半部分设置为正好 10 行,无论终端的大小如何。如果父布局是水平布局而不是垂直布局,则大小适用于字符数而不是行数。

除了固定大小之外,还可以在构造函数上设置参数或通过分配给属性来灵活布局。该比率定义布局相对于其他布局应占用多少屏幕。例如,让我们重置大小并将上部布局的比例设置为 2:ratio

layout["upper"].size = None
layout["upper"].ratio = 2
print(layout)

这使得顶部布局占据了三分之二的空间。这是因为默认比率为 1,使上下布局的总和为 3。由于上部布局的比例为 2,因此它占用了三分之二的空间,将剩余的三分之一留给下部布局。

设置了比率的布局也可能具有最小大小,以防止其变得太小。例如,以下是我们如何设置下部子布局的最小大小,使其不会缩小到 10 行以上:

layout["lower"].minimum_size = 10

能见度

您可以通过将属性设置为 False 来使布局不可见。下面是一个示例:visible

layout["upper"].visible = False
print(layout)

顶部布局现在不可见,“较低”布局将扩展以填充可用空间。设置为 True 以将其恢复:visible

layout["upper"].visible = True
print(layout)

您可以使用它根据应用程序的配置切换界面的某些部分。

为了帮助可视化复杂的布局,您可以打印属性,该属性将布局摘要显示为树:tree

print(layout.tree)