如何将 Rich 与 Python curses 集成?

How to integrate Rich with Python curses?

我正在考虑使用 python cursesrich 库创建一个 CLI 应用程序。由于 curses 需要 addstr 方法将文本打印为字符串,因此我无法使用 rich 进行打印。是否可以整合这两个库?

以下代码无效!!

import curses
from curses import wrapper
from rich.console import Console
console = Console()
with console.capture() as capture:
    console.print("[bold red]Hello[/] World")
str_output = capture.get()

def main(stdscr):
    stdscr.clear()
    stdscr.addstr(str_output)
    stdscr.refresh()
    stdscr.getch()

wrapper(main)

您似乎想将内容从 rich 传输到 curses,但 print() 函数实际上并未返回任何内容,它只是在终端上创建输出作为副作用执行。

您可以通过查看 type(print("[red]Hello[/red] World!")) 进行验证,即 <class 'NoneType'>

那么,如何检索 print(...) 的输出?在 docs for rich 中,他们解释了如何使用控制台 API:

from rich.console import Console
console = Console()
with console.capture() as capture:
    console.print("[bold red]Hello[/] World")

str_output = capture.get()


>>> str_output
'\x1b[1;31mHello\x1b[0m World\n'
>>> print(str_output)
Hello World

>>> type(str_output)
<class 'str'>

它允许您访问 print 的输出,然后您可以尝试将该信息通过管道传递给 curses。如果由于颜色转义码在 shell 中的工作方式而重叠它们的颜色上下文,您可能 运行 会因混合 cursesrich 而受到一些奇怪的干扰,因此请注意这一点。

这里是 Rich 的作者。 Rich 和 Curses 可能无法很好地结合使用。但是,您可以查看 Textual,这是我正在开发的一个 TUI 框架,它在底层使用了 Rich。