
大家好,欢迎来到 Crossin 的编程教室
平时我们用 Python 写点实用小工具,最常用的交互方式大概就是通过 print 和 input 的命令行输入输出。
命令行(CLI)有它的优点:准确、直接、稳定,代码实现起来也简单。但缺点就是不够直观和美观,交互不够友好。如果只是自己用还好,要是给其他非程序员同事或亲朋好友用,那对方多少会有点难以适应。
想做个好看点的界面,一般就会考虑找个 GUI 框架,或者干脆写一套前后端分离的网站,工作量一下子增加不少。
这其实大可不必。今天介绍的这个 GitHub 爆火项目 Textual,能让你用纯 Python 代码,在终端里直接手搓出一套现代化的 UI。

Textual 是什么?
不少同学对终端界面的印象可能还停留在那种蓝底白字的旧时代。但时代早就变了。之前我们介绍过的 Rich 就能让你整出酷炫的控制台输出。(参见:控制台输出也能玩这么花?!)
今天要说的 Textual 就是基于 Rich 开发的,它把终端的颜值和交互拉到了新的高度。
你可以把它理解为“终端里的浏览器”。它自带了大量控件,让你轻松画出带边框的窗口、侧边栏、搜索框、甚至是带丝滑动画的进度条。



更让人惊叹的是它引入了 Web 开发的思想——支持类 CSS 的样式表。你想改个按钮颜色、调个间距,改几行样式代码就行,不用在逻辑代码里绕圈子。
快速上手
同绝大多数第三方库一样,使用 textual 前要先通过 pip 命令安装一下:
pip install textual通过一段示例代码来初步了解下 textual 的用法:
from textual.app import App, ComposeResult
from textual.widgets import Button, Digits
from textual.containers import Center, Middle
class CounterApp(App):
"""
一个简单的计数器应用
继承自 textual.app.App,这是所有 Textual 程序的基类
"""
# CSS 样式定义:支持类 CSS 语法,用来控制组件的颜色、边距和对齐
CSS = """
Digits {
color: #00ff00; /* 绿色数字,带点极客范儿 */
margin-bottom: 1; /* 下边距,别和按钮贴得太近 */
text-align: center;
width: auto;
}
Button {
width: 16; /* 固定按钮宽度 */
margin: 1; /* 按钮四周留点空隙,呼吸感 */
}
"""
def compose(self) -> ComposeResult:
"""
这个方法相当于 HTML 里的 body 结构
用来定义界面上“有什么”组件
"""
# Middle 容器负责把内部的所有东西在“垂直方向”居中
with Middle():
# Center 容器负责把内部的东西在“水平方向”居中
with Center():
# Digits 是 Textual 专门用来显示大数字的组件
yield Digits("0")
with Center():
# id 是组件的唯一标识,后面逻辑判断时会用到
# variant 是内置的样式主题:success 为绿,error 为红
yield Button("点我加1", variant="success", id="add")
yield Button("点我减1", variant="error", id="sub")
def on_button_pressed(self, event: Button.Pressed) -> None:
"""
事件处理器:命名规则是 on_ + 组件名 + _事件名
只要界面上有任何 Button 被按下,这个方法就会被触发
"""
# 1. 找到我们要修改的那个数字组件
# self.query_one 会在界面中查找第一个匹配的 Digits 类型组件
digits = self.query_one(Digits)
# 2. 获取当前显示的数值并转成整数
count = int(digits.value)
# 3. 根据被点击按钮的 id 来判断是加还是减
# event.button 指向的就是当前触发事件的那个按钮对象
if event.button.id == "add":
digits.update(str(count + 1))
else:
digits.update(str(count - 1))
if __name__ == "__main__":
# 实例化应用并启动
app = CounterApp()
app.run()发现没有,我们不需要去研究什么窗口坐标、像素对齐,只需要定义好“有什么”和“怎么变”。
运行之后,终端就成了一个带交互的小软件,支持鼠标点击、键盘快捷键等操作。

不只是终端
Textual 的厉害之处不只是在控制台。它还可以把你写的交互界面运行在浏览器里,而且不需要做额外的改动。
这里需要安装下 textual-dev 工具包:
pip install textual-dev它除了提供浏览器运行的支持,也用于对终端程序运行中的调试。
执行命令:
textual serve 你的代码.py这时就能看到服务器脚本开始运行:

然后就能通过浏览器打开刚才的程序了:

假如你写了个监控服务器状态的小工具,想让同事在自己电脑上通过浏览器随时直接查看。过去你可能考虑用 flask 写个页面,然后还得自己折腾前端。
现在有了 textual,一行命令就能把你之前写好的终端界面“投影”到网页上。别人打开链接,看到的就是跟终端一模一样的显示和交互效果。这对于远程演示或者轻量级的运维后台来说,实在是太方便了。
适用场景
当然,没有工具是万能,关键还得看是否合适。
如果你写的是那种“用完即扔”的自动化脚本,追求的是效率,没必要整这些花里胡哨的。而如果你的项目需要展示复杂的 3D 模型或者有成千上万行的实时数据刷新,原生 GUI 或者 Web 才是正解。
但如果你正准备写个数据库管理工具、本地文件搜索器,或者就是一个想让自己用着舒服的运维看板,Textual 可以说是目前平衡“开发成本”和“视觉效果”的最佳方案。它的跨平台支持也很好,只要有终端的地方(哪怕是你 SSH 连上的远程服务器),就能稳稳地跑起来。
Textual 的出现,让 Python 开发者在“简陋的脚本”和“复杂的软件”之间找到了一个折中的解决方案。如果你也觉得平时写的工具界面太枯燥了,不妨也试着用 textual 改造一下吧~
本文分享自 Crossin的编程教室 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!