蚊章汇 - Textual
type: channel
link: https://linuxcn.bwsl.wang/tag/Textual/
items: Textual：为 Python 增加漂亮的文本用户界面（TUI）

Textual：为 Python 增加漂亮的文本用户界面（TUI）
type: item
date: 2024-01-15T19:04:38+08:00
description: 快速入门使用 TextualPython 在 Linux 上有像 TkInter 这样的优秀 GUI（图形用户界面）开发库，但如果你不能运行图形应用程序怎么办？文本终端，并非只在 Linux 上有，而且 BSD 和其它的出色的类 Unix 操作系统上也有。如果你的代码是用 Python 编写的，你应该使用 Textual 来帮助你编写 TUI（文本用户界面）。在这个快速介绍中，我将向你展示两个你可以用 Textual 做的示例，并且介绍它未来可能的应用方向。所以 Textual 是什么？Textual 是一个为 Python 构建的快速应用程序开发框架，由 Textualize.io 构建。它可以让你用简单的 Python API 构建复杂的用户界面，并运行在终端或网络浏览器上！你需要的跟进这个教程的工具你需要有以下条件：具备基础的编程经验，最好熟练使用 Python。理解基础的面向对象概念，比如类和继承。一台安装了 Linux 与 Python 3.9+ 的机器一款好的编辑器（Vim 或者 PyCharm 是不错的选择）我尽可能简单化代码，以便你能轻松理解。此外，我强烈建议你下载代码，或至少按照接下来的说明安装相关程序。安装步骤首先创建一个虚拟环境：python3 -m venv ~/virtualenv/Textualize 现在，你可以克隆 Git 仓库并创建一个可以编辑的发布版本：. ~/virtualenv/Textualize/bin/activate pip install --upgrade pip pip install --upgrade wheel pip install --upgrade build pip install --editable . 或者直接从 Pypi.org 安装：. ~/virtualenv/Textualize/bin/activate pip install --upgrade KodegeekTextualize 我们的首个程序：日志浏览器这个 日志浏览器 就是一款简单的应用，能执行用户 PATH 路径上的一系列 UNIX 命令，并在任务执行完毕后捕获输出。以下是该应用的代码：import shutil from textual import on from textual.app import ComposeResult, App from textual.widgets import Footer, Header, Button, SelectionList from textual.widgets.selection_list import Selection from textual.screen import ModalScreen # Operating system commands are hardcoded OS_COMMANDS = { "LSHW": ["lshw", "-json", "-sanitize", "-notime", "-quiet"], "LSCPU": ["lscpu", "--all", "--extended", "--json"], "LSMEM": ["lsmem", "--json", "--all", "--output-all"], "NUMASTAT": ["numastat", "-z"] } class LogScreen(ModalScreen): # ... Code of the full separate screen omitted, will be explained next def __init__(self, name = None, ident = None, classes = None, selections = None): super().__init__(name, ident, classes) pass class OsApp(App): BINDINGS = [ ("q", "quit_app", "Quit"), ] CSS_PATH = "os_app.tcss" ENABLE_COMMAND_PALETTE = False # Do not need the command palette def action_quit_app(self): self.exit(0) def compose(self) -> ComposeResult: # Create a list of commands, valid commands are assumed to be on the PATH variable. selections = [Selection(name.title…