Textual:用 Python 写终端应用,还能一键搬到浏览器上

Textual:用 Python 写终端应用,还能一键搬到浏览器上

Textualize 公司开源的终端 UI 框架 Textual,目前在 GitHub 上获得了 36k+ Star。

正文顶部截图

README区域截图

Textual 是一个纯 Python 的终端 UI 框架,用简单的 Python API 就能构建跨平台的用户界面。应用可以跑在终端里,也可以跑在浏览器上。

以前想在终端里写出好看的 UI,基本只能啃 curses,或者在不同第三方库之间做取舍。Textual 把这套东西封装成了组件化架构,写 Python 就好,不用折腾底层。

Textual 内置的 Widget 库覆盖了日常开发需要的大部分控件。按钮、树形控件、数据表格、输入框、文本域都在库里,配合灵活的布局系统可以组合出各种界面形态。框架预置了多套主题,开箱就有不错的视觉效果。

框架底层是异步的。可以接异步库做一些高级操作,但如果不想用 async,直接写同步代码也能正常跑,不会强制你学新概念。

代码写起来很直接。下面是一个实时更新的时钟应用:

from datetime import datetime
from textual.app import App, ComposeResult
from textual.widgets import Digits

class ClockApp(App):
    CSS = """
    Screen { align: center middle; }
    Digits { width: auto; }
    """

    def compose(self) -> ComposeResult:
        yield Digits("")

    def on_ready(self) -> None:
        self.update_clock()
        self.set_interval(1, self.update_clock)

    def update_clock(self) -> None:
        clock = datetime.now().time()
        self.query_one(Digits).update(f"{clock:%T}")

if __name__ == "__main__":
    app = ClockApp()
    app.run()

十几行代码,每秒刷新一次的终端时钟就出来了。CSS 风格的样式写法,前端开发者上手会很快。

Textual 内置了模糊搜索的命令面板,按 ctrl+p 呼出。可以把应用功能注册为自定义命令,扩展很方便。


安装使用

安装走 pip,同时装好开发工具包:

pip install textual textual-dev

装完直接运行官方 demo 看效果:

python -m textual

也可以用 uv 不安装直接跑:

uvx --python 3.12 textual-demo

终端跑的,浏览器也能跑

Textual 的应用不光在终端里运行。用 textual serve 命令,可以把任何 Textual 应用部署到 Web:

textual serve "python -m textual"

配合 Textual Web 服务还能突破防火墙限制对外提供访问。Textual 应用对系统资源要求不高,任何能跑 Python 的设备都可以作为服务端。


调试工具

textual-dev 包带了一个开发控制台,从另一个终端连到运行中的应用,系统消息、事件、日志和 print 输出全部在那里显示。终端里调试终端应用这件事,它处理得挺利落。


Textual 还内置了组件测试框架,方便对 UI 做单元测试。对于需要长期维护的项目来说,这个能力很关键。

框架由 Textualize 公司持续维护,社区活跃,文档完善。如果你想用 Python 做终端应用,或者给现有命令行工具换个好看的界面,Textual 值得一试。

posted @ 2026-06-04 12:11  techarch  阅读(4)  评论(0)    收藏  举报