布局

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

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

python -m rich.layout

创建布局

要定义布局,请构造一个 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 的第一个位置参数可以是任何 Rich 渲染器,它将被调整大小以适合布局区域。以下是如何将“右侧”布局划分为两个面板

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)

固定大小

您可以通过在 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 相结合以创建全屏“应用程序”的示例。