💻

textual紹介

に公開

はじめに

どうも、セカンドセレクション前野です。
近頃、Linuxでの開発がほとんどとなり、あわせてDockerコンテナでの分散処理となってきました。
コマンドラインツールでもいいのですが、1つの画面でいろいろ表示したり入力できるようにしたいという欲望が湧いてきました。

GUIアプリとかブラウザなんかを考えたのですが、大げさなと考えてTUIでもできるのではないかとTextualにたどり着きました。

ここではTextualの紹介します。

textualイメージ

目次

1. Textualとは?

  • Textualは、Pythonで書かれたターミナルアプリケーションを作成するためのフレームワークです。
  • 高度なテキストUI(ユーザーインタフェース)を簡単に構築できます。
  • 直感的でシンプルなAPIを提供し、複雑なインタラクションを作成するのに役立ちます。

2. Textualのメリット

1. 高度なテキストUIの作成が容易

  • Textualは、Pythonを使用して高度なテキストベースのUIを簡単に作成できるフレームワークです。
  • 複雑なUIコンポーネント(ボタン、フォーム、リストなど)を簡潔なコードで実現できます。

2. 非同期対応

  • 非同期処理が標準でサポートされており、パフォーマンスの高いアプリケーションを構築できます。
  • ユーザーインタラクションやネットワークリクエストを非同期で処理できるため、レスポンスが速くなります。

3. シンプルで直感的なAPI

  • TextualのAPIはシンプルで直感的であり、初心者にも扱いやすいです。
  • UIの定義やイベントのハンドリングは少ないコードで実現でき、学習コストを抑えられます。

4. 直感的なレイアウト作成

  • レイアウトはウィジェットを組み合わせるだけで簡単に作成できます。
  • レスポンシブなデザインが可能で、コンソール画面のサイズに合わせてUIが自動的に調整されます。

5. クロスプラットフォーム

  • Textualは、ターミナル上で動作するため、Linux、macOS、Windowsなど、クロスプラットフォームで動作します。
  • ユーザーは、プラットフォームに依存せずアプリケーションを使用できます。
  • pipだけで環境をインストールできます。

6. スタイルのカスタマイズ

  • CSSのようなスタイルシートを使用して、アプリケーションの外観をカスタマイズできます。
  • 色やフォント、サイズなどを簡単に変更し、視覚的に魅力的なインタフェースを作成できます。

7. ターミナル通信

  • ssh接続できればUIが構築できる。
  • キャラクターなんで通信負荷が低く抑えられる。

3. Textualのデメリット

1. グラフィカルなインタフェースには不向き

  • TextualはターミナルベースのUIライブラリであるため、GUI(グラフィカルユーザーインタフェース)向けではありません。
  • 高度なグラフィックスやアニメーションを含むアプリケーションには向いていません。

2. 学習曲線

  • 一見シンプルに見えますが、Textualの機能を十分に活用するには、非同期プログラミングやイベント駆動型プログラミングに関する知識が必要です。
  • 初心者には学習曲線が若干あります。
  • Textual用のvscodeの拡張機能があればいいのですが、今の所見つけられていません。

3. ターミナル依存

  • Textualはターミナル環境で動作するため、グラフィカルなアプリケーションを作成する場合、他のGUIフレームワーク(例:TkinterやPyQt)を使う方が適していることがあります。
  • ターミナルに慣れていないユーザーには慣れが必要です。

4. 限られたコンポーネント

  • 他のUIフレームワーク(例えばTkinterやPyQt)と比べて、Textualには提供されているウィジェットやコンポーネントが少ないです。
  • 複雑なUIやカスタムウィジェットを作成するには追加の作業が必要になる場合があります。

5. パフォーマンスの制限

  • 高度なグラフィカルな処理やリアルタイムのアニメーションには限界があります。
  • よりリッチなインタラクションが求められる場合、Textualのパフォーマンスに制約があると感じることがあります。

4. Textualのインストール方法

pip install textual
  • pipを使用して簡単にインストールできます。

5. 基本的な使い方

  • Textualを使用するには、Appクラスを継承し、UIコンポーネントを構築します。
from textual.app import App
from textual.widgets import Text

class MyApp(App):
    def compose(self):
        yield Text("Hello, Textual!")

if __name__ == "__main__":
    MyApp.run()
  • 上記のコードは、Textualアプリケーションを作成し、ターミナルに「Hello, Textual!」というメッセージを表示します。

6. レイアウトの作成

  • Textualでは、複数のウィジェットを使ってレイアウトを作成できます。
from textual.app import App
from textual.widgets import Button, Header, Footer

class LayoutApp(App):
    def compose(self):
        yield Header()
        yield Footer()
        yield Button("Click Me!")

if __name__ == "__main__":
    LayoutApp.run()
  • Header, Footer, Buttonなどのウィジェットを使って、画面全体のレイアウトを作成できます。

7. インタラクションの追加

  • ユーザーがボタンをクリックしたり、キー入力するインタラクションを簡単に追加できます。
from textual.app import App
from textual.widgets import Button

class InteractiveApp(App):
    def compose(self):
        yield Button("Click Me!")

    async def on_button_pressed(self, event):
        print("Button was clicked!")

if __name__ == "__main__":
    InteractiveApp.run()
  • on_button_pressedメソッドを使って、ボタンがクリックされた際の動作を指定できます。

8. 高度な機能

  • スタイルのカスタマイズ: Textualでは、CSSのようなスタイルを使ってUIをカスタマイズできます。
  • 非同期処理: 非同期プログラミングに対応しており、アプリケーションのパフォーマンスを向上させることができます。
  • ダイアログ: モーダルウィンドウやポップアップなど、複雑なUIを作成できます。

10. さいごに

PythonでTUIのフレームワークを探してみたのですが、Textualぐらいウィジェットが充実しているものはありませんでした。

でも、癖が強いように感じますので、簡単なツールを作るぐらいでとどめておくのが吉です。

当分Textualと付き合っていく予定ですが、他によいTUIのフレームワークも随時探し中です。

セカンドセレクション

Discussion