«Textual - это фреймворк TUI (текстовый интерфейс пользователя) для Python, вдохновленный современной веб-разработкой. В настоящее время работа ведется, но ее могут использовать смельчаки, которые не возражают против нестабильности API между обновлениями ».

~ Текстовая страница Github

Этот проект действительно интересен и, возможно, выглядит так, как будто он может быть весьма ценным для приложений на основе терминала, таких как приложения для мониторинга, текстовые редакторы, подобные vim / emacs, сложные интерактивные интерфейсы командной строки или, возможно, даже информационные панели.

Простое приложение

from textual.app import App


class Beeper(App):
    def on_key(self):
        self.console.bell()


Beeper.run()

Макеты с виджетами

Макеты в любой структуре приложения являются жизненно важным компонентом для создания разумных пользовательских интерфейсов, а Textual делает это довольно простым с помощью функции App.view.dock().

from textual.app import App
from textual.widgets import Placeholder


class SimpleApp(App):

    async def on_mount(self) -> None:
        await self.view.dock(Placeholder(), edge="left", size=40)
        await self.view.dock(Placeholder(), Placeholder(), edge="top")


SimpleApp.run(log="textual.log")

Пользовательские виджеты

Пользовательские виджеты легко создавать и предоставляют отличный способ создания специализированных и потенциально повторно используемых компонентов для вашего приложения.

from rich.panel import Panel

from textual.app import App
from textual.reactive import Reactive
from textual.widget import Widget


class Hover(Widget):

    mouse_over = Reactive(False)

    def render(self) -> Panel:
        return Panel("Hello [b]World[/b]", style=("on red" if self.mouse_over else ""))

    def on_enter(self) -> None:
        self.mouse_over = True

    def on_leave(self) -> None:
        self.mouse_over = False


class HoverApp(App):
    """Demonstrates custom widgets"""

    async def on_mount(self) -> None:
        hovers = (Hover() for _ in range(10))
        await self.view.dock(*hovers, edge="top")


HoverApp.run(log="textual.log")

Управляющие сочетания клавиш

также возможно привязать определенные клавиши к действиям в приложении, что может сделать работу пользователя действительно удобной для таких действий, как прокрутка элементов (стрелки) и выход (q).

from textual.app import App


class Quitter(App):
    async def on_load(self, event):
        await self.bind("q", "quit")


Quitter.run()

Построен на RICH

Rich API позволяет легко добавлять цвет и стиль к выводу терминала. Rich также может отображать красивые таблицы, индикаторы выполнения, уценку, исходный код с выделенным синтаксисом, трассировки и многое другое - прямо из коробки.

~ Rich Github Page

Тот факт, что Textual построен на уже установленных фреймворках, на мой взгляд, в большинстве случаев является хорошим знаком. Этот подход хорошо зарекомендовал себя для других проектов.

использованная литература