实时显示¶
进度条和状态指示器使用实时显示来动画化终端的某些部分。可以使用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
,使实时显示在退出时消失。
自动刷新¶
默认情况下,实时显示每秒刷新 4 次。您可以在Live
构造函数的refresh_per_second
参数中设置刷新率。如果您知道更新频率不会那么高,则应该将其设置为低于 4 的值,或者设置为更高的值以获得更流畅的感觉。
如果您知道更新频率不那么高,则可能希望完全禁用自动刷新,这可以通过在构造函数中设置auto_refresh=False
来实现。如果您禁用自动刷新,则需要手动调用refresh()
,或者使用refresh=True
调用update()
。
垂直溢出¶
默认情况下,如果渲染对象的大小超过终端的大小,实时显示将显示省略号。您可以通过在Live
构造函数的vertical_overflow
参数中设置值来调整此行为。
“裁剪” 显示渲染对象,直到终端高度。其余部分将被隐藏。
“省略号” 类似于裁剪,但终端的最后一行将替换为“…”。这是默认行为。
“可见” 将允许显示整个渲染对象。请注意,在此模式下无法正确清除显示。
注意
一旦实时显示停止在非瞬时渲染对象上,最后一个帧将以可见方式渲染,因为它不需要被清除。
打印 / 日志¶
Live 类将创建一个内部 Console 对象,您可以通过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")
如果您要使用另一个 Console 对象,请将其传递到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
来禁用它。
嵌套实时显示¶
请注意,一次只能激活一个实时上下文。以下操作将引发LiveError
,因为 status 也使用 Live
with Live(table, console=console):
with console.status("working"): # Will not work
do_work()
在实践中,这很少是一个问题,因为您可以在实时上下文中显示任何组合的渲染对象。
示例¶
有关更深入的实时显示示例,请参阅table_movie.py和top_lite_simulator.py。