レイアウト

Rich は、画面領域を複数の部分に分割するために使用できる Layout クラスを提供しています。各部分は独立したコンテンツを含むことができます。これは、ライブ表示 と共に使用してフルスクリーンの「アプリケーション」を作成できますが、単独で使用することもできます。

レイアウトの例を見るには、コマンドラインから以下を実行してください。

python -m rich.layout

レイアウトの作成

レイアウトを定義するには、Layout オブジェクトを構築して出力します。

from rich import print
from rich.layout import Layout

layout = Layout()
print(layout)

これは、レイアウトに関する情報を含む、端末のサイズに合わせたボックスを描画します。ボックスにはまだコンテンツを追加していないため、「プレースホルダー」です。コンテンツを追加する前に、split_column() メソッドを呼び出して、レイアウトを2つのサブレイクアウトに分割してみましょう。

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

これは、端末画面を上下に2つの等しいサイズの部分に分割します。name 属性は、後でサブレイクアウトを検索するために使用できる内部識別子です。それを使用して別の分割を作成してみましょう。今回は、split_row() を呼び出して、下のレイアウトを2つのサブレイクアウトの行に分割します。

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

これで、画面領域が3つの部分に分割されているはずです。上半分と、2つの四分の一に分割された下半分です。

╭─────────────────────────────── '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 でレンダリング可能なオブジェクトです。「右」のレイアウトを2つのパネルに分割する方法は次のとおりです。

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)

これにより、上のレイアウトはスペースの3分の2を占めます。これは、デフォルトの比率が1であるため、上下のレイアウトの合計が3になるためです。上のレイアウトの比率が2であるため、スペースの3分の2を占め、残りの3分の1が下のレイアウトに使用されます。

比率が設定されたレイアウトには、小さくなりすぎるのを防ぐための最小サイズを設定することもできます。たとえば、下のサブレイヤーアウトの最小サイズを設定して、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)

LayoutLive を組み合わせてフルスクリーンの「アプリケーション」を作成する例については、fullscreen.py を参照してください。