布局

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

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

python -m rich.layout

创建布局

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

from rich import print
from rich.layout import Layout

layout = Layout()
print(layout)

这将绘制一个端子大小的框,其中包含一些有关布局的信息。该框是一个“占位符”,因为我们还没有向其中添加任何内容。在此之前,让我们通过调用 split_column() 方法将布局分为两个子布局::

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

这将把终端屏幕分成两个大小相等的部分,一个在另一个的上面。这个 name 属性是我们稍后可以用来查询子布局的内部标识符。让我们使用它来创建另一个拆分,这次我们将调用 split_row() 要将下部布局拆分为一行两个子布局,请执行以下操作:

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(),以便在屏幕上创建任意多个部分。

设置可渲染对象

的第一个位置参数 Layout 可以是任何丰富的可渲染对象,其大小将调整为适合布局的区域。下面是如何将“正确”布局划分为两个面板的方法:

from rich.panel import Panel

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

您也可以拨打 update() 要设置或替换当前可渲染对象,请执行以下操作:

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

固定大小

属性可以将布局设置为使用固定大小 size 参数,或通过设置该属性。以下是一个示例:

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

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

比率

除了固定大小外,还可以灵活地设置 ratio 参数,或通过向属性赋值来实现。该比率定义了该布局相对于其他布局应该占据多少屏幕。例如,让我们重置大小并将上方布局的比例设置为2::

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

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

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

layout["lower"].minimum_size = 10

可见性

属性可以使布局不可见 visible 属性设置为False。以下是一个示例:

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

顶部布局现在不可见,而“下部”布局将扩展以填充可用空间。集 visible 设置为True将其带回::

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

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

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

print(layout.tree)

示例

看见 fullscreen.py 举个例子,它结合了 LayoutLive 创建一个全屏“应用程序”。