1029 字
5 分钟
控制台富文本 UI 库 Rich 学习笔记(三):增强交互体验
NOTE

在上一节中,我们学习了如何使用 Rich 构建静态的界面组件(面板、表格、布局)。本节我们将深入探索 Rich 如何提升**调试体验**和**用户交互**能力。无论是让报错信息更易读,还是让用户输入更优雅,Rich 都能提供开箱即用的解决方案。

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

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 学习笔记(三):增强交互体验
https://blog.wentianlivas.top/posts/控制台富文本-ui-库-rich-学习笔记三增强交互体验/
作者
Andy
发布于
2026-03-31
许可协议
CC BY-NC-SA 4.0