Textual:用 Python 写终端应用,还能一键搬到浏览器上
Textual:用 Python 写终端应用,还能一键搬到浏览器上
Textualize 公司开源的终端 UI 框架 Textual,目前在 GitHub 上获得了 36k+ Star。


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 值得一试。

浙公网安备 33010602011771号