Гибридная архитектура: Терминал + Веб
Textual — это асинхронный фреймворк для Python, который стирает грань между консольными приложениями и веб-интерфейсами. Главная особенность платформы: одно и то же приложение, написанное на Python, может запускаться в стандартном терминале или быть развернуто в браузере с помощью технологии textual serve. Это позволяет разработчикам создавать инструменты, доступные как локально, так и удаленно, без необходимости писать два разных кода.
Ключевые возможности и компоненты
Фреймворк предлагает богатый набор виджетов (Widgets), включая кнопки, деревья, таблицы данных, поля ввода и текстовые области. Архитектура построена на декомпозированных компонентах, что упрощает долгосрочную поддержку. Среди встроенных инструментов выделяются:
- Dev Console: Специальная консоль отладки, подключаемая из другого терминала. Она перехватывает системные сообщения, события и логи, что критически важно для отладки приложений, работающих в терминале.
- Command Palette: Встроенная палитра команд с нечетким поиском (fuzzy search), вызываемая по
Ctrl+P. Разработчики могут легко добавлять в нее собственные команды. - Тестирование: Продвинутая фреймворк для тестирования, обеспечивающий надежность приложений.
Технические детали и установка
Textual работает на асинхронной основе (async), но не навязывает этот подход, если он не нужен. Приложение может использовать асинхронные библиотеки, если это требуется для интеграции. Для быстрого старта доступна демо-версия, которую можно запустить без установки через uvx.
| Функция/Инструмент | Описание | Пример использования |
|---|---|---|
| Установка | Через pip | pip install textual textual-dev |
| Запуск демо | Локально | python -m textual |
| Запуск демо | Без установки (требует uv) | uvx --python 3.12 textual-demo |
| Веб-сервер | Запуск приложения в браузере | textual serve "python -m textual" |
Пример кода: Часы в терминале
Простота API позволяет создавать функциональные интерфейсы с минимальным количеством кода. Ниже приведен пример приложения, отображающего текущее время с обновлением каждую секунду:
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("00:00:00")
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()
Почему это важно
Textual решает проблему разрыва между мощными CLI-инструментами и современными веб-интерфейсами. Разработчики могут создавать приложения с низким потреблением ресурсов, которые работают на любом устройстве с Python, и при необходимости мгновенно делать их доступными через веб-браузер благодаря технологии Textual Web, способной обходить файрволы.
Источник: Github ↗
