进度条和状态指示器使用实时显示来对终端的各个部分进行动画处理。您可以使用该类构建自定义实时显示。
要演示实时显示,请运行以下命令:
python -m rich.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")
更新可渲染对象¶
还可以通过调用该方法动态更改可呈现对象。如果要显示的信息过于动态而无法通过更新单个可呈现对象生成,则这可能很有用。下面是一个示例:
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
您可以将此功能与布局结合使用,以显示复杂的终端“应用程序”。
瞬态显示¶
通常,当您退出实时上下文管理器(或调用)时,最后刷新的项目将保留在终端中,光标位于下一行。 还可以通过设置 Live 构造函数使实时显示在退出时消失。transient=True
自动刷新¶
默认情况下,实时显示每秒将刷新 4 次。您可以使用构造函数上的参数设置刷新率。 如果您知道您的更新不会那么频繁或更高,则应将其设置为低于 4 以获得更流畅的感觉。refresh_per_second
如果更新不是很频繁,则可能需要完全禁用自动刷新,可以通过设置构造函数来实现。 如果禁用自动刷新,则需要手动调用或使用 。auto_refresh=False
refresh=True
垂直溢出¶
默认情况下,如果可渲染对象对于终端来说太大,实时显示将显示省略号。可以通过在构造函数上设置参数来调整此设置。vertical_overflow
-
“裁剪” 显示可渲染到终端高度。其余的都是隐藏的。
-
“省略号” 与裁剪类似,但终端的最后一行替换为“...”。这是默认行为。
-
“可见” 将允许显示整个可渲染内容。请注意,在此模式下无法正确清除显示。
注意
一旦实时显示停止在非瞬态可渲染对象上,最后一帧将渲染为可见,因为它不必被清除。
打印/日志¶
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")
如果您有另一个要使用的控制台对象,请将其传递给构造函数。下面是一个示例:
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:LiveError
with Live(table, console=console):
with console.status("working"): # Will not work
do_work()
实际上,这很少是一个问题,因为您可以在实时上下文中显示可渲染对象的任意组合。