ライブ表示¶
プログレスバーとステータスインдикаータは、ターミナルの一部をアニメーション化するために*ライブ*表示を使用します。 Live
クラスを使用して、カスタムライブ表示を作成できます。
ライブ表示のデモを見るには、次のコマンドを実行してください
python -m rich.live
注記
省略記号「…」が表示されている場合は、ターミナルの高さがテーブル全体を表示するのに十分でないことを示しています。
基本的な使い方¶
ライブ表示を作成するには、レンダリング可能なオブジェクトを使用して Live
オブジェクトを構築し、コンテキストマネージャとして使用します。ライブ表示は、コンテキストの期間中持続します。レンダリング可能なオブジェクトを更新して、表示を更新できます
import time
from rich.live import Live
from rich.table import Table
table = Table()
table.add_column("Row ID")
table.add_column("Description")
table.add_column("Level")
with Live(table, refresh_per_second=4): # update 4 times a second to feel fluid
for row in range(12):
time.sleep(0.4) # arbitrary delay
# update the renderable internally
table.add_row(f"{row}", f"description {row}", "[red]ERROR")
レンダリング可能なオブジェクトの更新¶
update()
メソッドを呼び出すことによって、レンダリング可能なオブジェクトをオンザフライで変更することもできます。これは、表示したい情報が単一のレンダリング可能なオブジェクトを更新するには動的すぎる場合に役立ちます。次に例を示します
import random
import time
from rich.live import Live
from rich.table import Table
def generate_table() -> Table:
"""Make a new table."""
table = Table()
table.add_column("ID")
table.add_column("Value")
table.add_column("Status")
for row in range(random.randint(2, 6)):
value = random.random() * 100
table.add_row(
f"{row}", f"{value:3.2f}", "[red]ERROR" if value < 50 else "[green]SUCCESS"
)
return table
with Live(generate_table(), refresh_per_second=4) as live:
for _ in range(40):
time.sleep(0.4)
live.update(generate_table())
代替画面¶
コンストラクタで screen=True
を設定することにより、「代替画面」にライブ表示を表示することを選択できます。これにより、ライブ表示がフルスクリーンになり、終了時にコマンドプロンプトが復元されます。
この機能を レイアウト と組み合わせて使用して、高度なターミナル「アプリケーション」を表示できます。
一時的な表示¶
通常、ライブコンテキストマネージャを終了する(または stop()
を呼び出す)と、最後に更新されたアイテムは、次の行にカーソルがある状態でターミナルに残ります。 Liveコンストラクタで transient=True
を設定することにより、終了時にライブ表示を消すこともできます。
自動更新¶
デフォルトでは、ライブ表示は1秒間に4回更新されます。 Live
コンストラクタの refresh_per_second
引数を使用して更新頻度を設定できます。更新頻度がそれほど高くない場合は、よりスムーズに感じられるように、4よりも低い値に設定する必要があります。
更新頻度がそれほど高くない場合は、自動更新を完全に無効にすることができます。これは、コンストラクタで auto_refresh=False
を設定することによって行うことができます。自動更新を無効にした場合は、 refresh()
を手動で呼び出すか、 refresh=True
を指定して update()
を呼び出す必要があります。
垂直方向のオーバーフロー¶
デフォルトでは、レンダリング可能なオブジェクトがターミナルに対して大きすぎる場合、ライブ表示は省略記号を表示します。 Live
コンストラクタの vertical_overflow
引数を設定することで、これを調整できます。
「crop」 ターミナルの高さまでレンダリング可能なオブジェクトを表示します。残りは非表示になります。
「ellipsis」 cropに似ていますが、ターミナルの最後の行が「…」に置き換えられます。これがデフォルトの動作です。
「visible」 レンダリング可能なオブジェクト全体を表示できます。このモードでは、表示を正しくクリアできないことに注意してください。
注記
ライブ表示が一時的でないレンダリング可能なオブジェクトで停止すると、クリアする必要がないため、最後のフレームは**visible**としてレンダリングされます。
出力 / ログ¶
Liveクラスは、 live.console
を介してアクセスできる内部コンソールオブジェクトを作成します。このコンソールに出力またはログを記録すると、出力はライブ表示の*上*に表示されます。次に例を示します
import time
from rich.live import Live
from rich.table import Table
table = Table()
table.add_column("Row ID")
table.add_column("Description")
table.add_column("Level")
with Live(table, refresh_per_second=4) as live: # update 4 times a second to feel fluid
for row in range(12):
live.console.print(f"Working on row #{row}")
time.sleep(0.4)
table.add_row(f"{row}", f"description {row}", "[red]ERROR")
使用する別のコンソールオブジェクトがある場合は、 Live
コンストラクタに渡します。次に例を示します
from my_project import my_console
with Live(console=my_console) as live:
my_console.print("[bold blue]Starting work!")
...
注記
ファイルコンソールを渡している場合、ライブ表示は、ライブコンテキストが終了した後にのみ最後のアイテムを表示します。
標準出力 / 標準エラー出力のリダイレクト¶
ライブ表示のビジュアルが壊れないように、Richは stdout
と stderr
をリダイレクトするため、組み込みの print
ステートメントを使用できます。この機能はデフォルトで有効になっていますが、 redirect_stdout
または redirect_stderr
を False
に設定することで無効にできます。
Liveのネスト¶
一度にアクティブにできるライブコンテキストは1つだけであることに注意してください。 statusもLiveを使用しているため、以下は LiveError
を発生させます
with Live(table, console=console):
with console.status("working"): # Will not work
do_work()
実際には、Liveコンテキストにレンダリング可能なオブジェクトの任意の組み合わせを表示できるため、これはめったに問題になりません。
例¶
ライブ表示のより詳細な例については、 table_movie.py と top_lite_simulator.py を参照してください。