社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

这个Python神库让你的命令行程序颜值翻倍

IT服务圈儿 • 2 月前 • 145 次点击  
来源 | 经授权转自 Crossin的编程教室(ID:crossincode)
作者 | Crossin先生

大家好,欢迎来到 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, ComposeResultfrom textual.widgets import Button, Digitsfrom 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()
  1. 使用 textual 需要创建一个 App 并 run()。

  2. compose 方法里添加了三个控件:1个 Digits 用来显示数字,2个 Button 用来控制数字加减。通过 Middle 和 Center 将控件居中放置。

  3. on_button_pressed 方法处理按钮点击事件的响应,根据点击按钮的不同来改变数字

发现没有,我们不需要去研究什么窗口坐标、像素对齐,只需要定义好“有什么”和“怎么变”。

运行之后,终端就成了一个带交互的小软件,支持鼠标点击、键盘快捷键等操作。

不只是终端

Textual 的厉害之处不只是在控制台。它还可以把你写的交互界面运行在浏览器里,而且不需要做额外的改动。

这里需要安装下 textual-dev 工具包:

pip install textual-dev

它除了提供浏览器运行的支持,也用于对终端程序运行中的调试。

执行命令:

textual serve 你的代码.py

这时就能看到服务器脚本开始运行:

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

假如你写了个监控服务器状态的小工具,想让同事在自己电脑上通过浏览器随时直接查看。过去你可能考虑用 flask 写个页面,然后还得自己折腾前端。

现在有了 textual,一行命令就能把你之前写好的终端界面“投影”到网页上。别人打开链接,看到的就是跟终端一模一样的显示和交互效果。这对于远程演示或者轻量级的运维后台来说,实在是太方便了。

适用场景

当然,没有工具是万能,关键还得看是否合适。

如果你写的是那种“用完即扔”的自动化脚本,追求的是效率,没必要整这些花里胡哨的。而如果你的项目需要展示复杂的 3D 模型或者有成千上万行的实时数据刷新,原生 GUI 或者 Web 才是正解。

但如果你正准备写个数据库管理工具、本地文件搜索器,或者就是一个想让自己用着舒服的运维看板,Textual 可以说是目前平衡“开发成本”和“视觉效果”的最佳方案。它的跨平台支持也很好,只要有终端的地方(哪怕是你 SSH 连上的远程服务器),就能稳稳地跑起来。

Textual 的出现,让 Python 开发者在“简陋的脚本”和“复杂的软件”之间找到了一个折中的解决方案。如果你也觉得平时写的工具界面太枯燥了,不妨也试着用 textual 改造一下吧~

项目地址:

https://github.com/Textualize/textual

如果本文对你有帮助,欢迎点赞、评论、转发。你们的支持是我更新的动力~

1、这个Python神库让你的命令行程序颜值翻倍

2、推荐 3 个 GitHub 画图 Skill,一句话生成流程图、架构图。

3、看了 1000 多个 PR 之后,这 7 个错误每次都出现

4、程序员最常用的10个AI提示词

5、聊聊Mybatis-Plus中的10个坑!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/195879