想在终端里做带界面交互的工具——进度条、表格、表单、仪表盘——传统做法要么用 curses 手写(难且丑),要么只能退回到纯文本。Textual 的切入点:用 Python 写逻辑、用类似 CSS 的语法写样式,把 Web 开发的心智直接搬进终端,做出好看又能交互的 TUI 应用。

项目基本信息

信息项详情
项目名称textual
GitHub地址https://github.com/Textualize/textual
项目描述用 Python 和 CSS 语法构建精美终端 UI 应用的框架
作者Textualize
开源协议MIT License
开源状态公开
Languages—
支持平台Windows / macOS / Linux
最后更新2026-10-09

一、项目介绍

Textualize/textual 是一个用 Python 构建终端 UI(TUI)的框架,MIT 协议。它让你用 Python 定义组件与事件,用类似 CSS 的样式表控制布局与外观,支持响应式布局、动画、异步与鼠标交互。Textual 还提供 Textual Web 能力,可把同一套 TUI 跑在浏览器里。它适合做终端仪表盘、日志查看器、交互式 CLI 工具等。

二、核心优势

  1. Web 式开发:组件 + CSS 样式,前端心智直接复用。
  2. 精美交互:支持布局、动画、鼠标与键盘事件。
  3. 异步友好:基于 asyncio,UI 不阻塞。
  4. 可上浏览器:Textual Web 把 TUI 跑在网页里。
  5. 跨平台:终端应用,Windows / macOS / Linux 一致。

三、适用场景

  • 终端仪表盘、实时监控与日志查看器。
  • 交互式 CLI 工具(表单、选择器、表格)。
  • 教学演示 TUI 编程。
  • 不想开浏览器、又要好看界面的场景。

四、安装教程

用 pip 安装:

pip install textual

常见报错:Windows 终端需支持 VT 转义(现代 Windows Terminal 默认可);虚拟环境可避免依赖冲突。

五、使用示例

一个最简计数器应用:

from textual.app import App, ComposeResult
from textual.widgets import Button, Label

class CounterApp(App):
    def compose(self) -> ComposeResult:
        yield Label("0")
        yield Button("+1")

    def on_button_pressed(self, event: Button.Pressed) -> None:
        self.query_one(Label).update(
            str(int(self.query_one(Label).renderable) + 1)
        )

CounterApp().run()

真实效果:运行后终端里出现一个标签与按钮,点击按钮数字 +1——用纯 Python + 事件就把交互界面做出来了,外观还能用 CSS 调整。

六、常见问题

Q:和 curses 比?
A:Textual 的组件/CSS/事件模型更接近现代前端,开发体验远好于裸 curses。
Q:能在浏览器跑吗?
A:可以,Textual Web 把同一套应用搬到网页。
Q:影响性能吗?
A:基于异步,UI 操作不阻塞;复杂界面仍需合理组织组件。

七、总结

Textual 把 Web 的组件与 CSS 心智带进终端,让 Python 开发者轻松做出好看又能交互的 TUI 应用。对要在命令行里提供图形化体验的团队,它是当下最现代的 Python TUI 框架;MIT 协议,还能上浏览器。