200字
控制台富文本 UI 库 Rich 学习笔记(三):增强交互体验
2026-03-11
2026-03-11
tips:info 在上一节中,我们学习了如何使用 Rich 构建静态的界面组件(面板、表格、布局)。本节我们将深入探索 Rich 如何提升**调试体验**和**用户交互**能力。无论是让报错信息更易读,还是让用户输入更优雅,Rich 都能提供开箱即用的解决方案。

控制台富文本 UI 库 Rich 学习笔记(二)

1. 捕获异常美化显示输出

Python 原生的 traceback(堆栈跟踪)信息通常是白底黑字或简单的红字,信息密集且难以快速定位问题。Rich 提供了 rich.traceback 模块,可以完全接管异常显示,提供语法高亮、局部变量显示以及更清晰的路径展示。

核心功能

  • install():一键安装 Rich 异常处理器,替代默认 sys.excepthook
  • show_locals:显示出错位置的局部变量值,调试神器。
  • theme:支持多种颜色主题。

代码示例

from rich.traceback import install

# 安装 Rich 异常处理器
# show_locals=True 会显示出错时的局部变量,调试时非常有用
install(show_locals=True)

def dangerous_function():
    data = {"key": "value"}
    # 故意触发 KeyError
    return data["missing_key"]

# 运行后会看到美化的报错信息,而不是原生 traceback
dangerous_function()

默认异常显示:

2026-03-10T23:47:00-xqrltnyv.png

开启异常显示但不显示局部变量:

2026-03-10T23:48:22-snysekcy.png

开启异常显示且显示局部变量:

2026-03-10T23:49:07-zggbajga.png

注意:一旦调用 install(),整个程序的未捕获异常都将通过 Rich 渲染。建议在开发环境开启,生产环境可根据日志配置决定。

2. 高亮输出显示

在 CLI 工具中展示代码片段或日志时,语法高亮能显著提升可读性。Rich 的 Syntax 类支持多种编程语言的语法高亮。

核心功能

  • Syntax:包裹代码字符串,指定语言类型。
  • line_numbers:显示行号。
  • theme:指定高亮主题(如 "monokai", "github-dark" 等)。

代码示例

from rich.console import Console
from rich.syntax import Syntax

console = Console()

code = """
def hello():
    print("Hello, World!")
    return True
"""

# 创建语法高亮对象
syntax = Syntax(code, "python", theme="monokai", line_numbers=True)
console.print(syntax)

输出结果:

2026-03-10T23:54:20-qazvhtma.png

3. Markdown 格式输出

如果你习惯使用 Markdown 编写文档,Rich 可以直接在终端中渲染 Markdown 内容。这对于展示帮助信息(Help Message)或 README 摘要非常有用。

核心功能

  • Markdown:解析 Markdown 字符串并渲染。
  • 支持元素:标题、列表、代码块、引用、表格等。

代码示例

from rich.markdown import Markdown

markdown_text = """
# 项目说明

这是一个 **Rich** 示例项目。

## 功能列表
- [x] 异常美化
- [x] 语法高亮
- [ ] 待办事项

> 注意:请在 Python 3.6+ 环境下运行。
"""

console.print(Markdown(markdown_text))

输出结果:

2026-03-11T00:03:22-vafutxuy.png

4. 用户交互功能

原生的 input() 功能单一,无法隐藏密码或提供友好的提示样式。Rich 的 rich.prompt 模块提供了多种交互组件。

核心功能

  • Prompt:带样式的文本输入。
  • Confirmyes/no 确认交互。
  • IntPrompt/FloatPrompt:带类型验证的输入。

代码示例

from rich.prompt import Prompt, Confirm

    # 普通输入
    name = Prompt.ask("请输入你的名字", default="Guest")

    # 密码输入(隐藏字符)
    while(True):
        password = Prompt.ask("请输入密码", password=True)
        if len(password)>0:
            break

    # 确认交互
    if Confirm.ask("是否继续操作?"):
        console.print("[green]操作已确认[/]")
        console.print(f"name={name}, password={password}")
    else:
        console.print("[red]操作已取消[/]")

    # 多选一
    choice = Prompt.ask("请输入你的英雄", default="妲己", choices=["妲己","张飞","李白"])

输出结果:

2026-03-11T00:40:02-nqmapbjs.png


建议

  1. 调试优先:在开发阶段,强烈建议在入口文件顶部加上 install(show_locals=True),这能节省大量排查 KeyErrorAttributeError 的时间。
  2. 帮助文档:利用 Markdown 类来编写 CLI 工具的 --help 信息,比纯文本更美观且易于维护。
  3. 交互阻塞Prompt 系列组件会阻塞程序等待用户输入。如果你需要生成静态文档(如 save_svg),请确保跳过交互部分或使用 default 参数避免等待。
  4. 主题选择Syntax 支持多种主题,可以通过 print(list(SYNTAX_LEXERS)) 查看支持的语言,通过 rich.style 查看支持的主题。

后续更新内容 Rich 的实时更新(Live)与进度条高级用法,让命令行界面真正“动”起来。

控制台富文本 UI 库 Rich 学习笔记(三):增强交互体验
Author
Administrator
Published at
2026-03-11
License
CC BY-NC-SA 4.0

Comment