Python チュートリアル:TUIフレームワーク
https://gyazo.com/153a339305d78fc4fa4850753e4b1594
はじめに
ターミナルベースユーザインタフェース(TUI: Terminal base User Interface)は、アプリケーションの動作中に端末にダイアログメッセージを表示するなどを行い、会話形インタフェースを提供するものです。こうしたアプリケーションを自作する場合では、複雑で面倒な端末処理を実装する必要があります。
Python にはTUIアプリケーションの開発を手助けしてくれる便利なモジュールやフレームワークが多数あります。ここでは、Windows でも動作することを条件として、その一部をここで紹介することにします。
curses:低レベルで操作するPython標準ライブラリ。 PyInquirer:質問を辞書形式で与えることでTUI処理を生成。prompt_toolkit を内部で利用。 rich:TUIアプリケーションのためのフレームワーク。 blessed blessings をフォークして機能拡張を施したTUIフレームワーク curses
Python標準ライブラリです。Linuxの ncurses ライブラリを Python から利用できるようにしたものです。低レベルで端末を操作できますが、次のコードでもわかるように、設定が煩雑でコード量も多くなってしまいます。
curses は Linux系プラットフォームで提供されているシステムライブラリ ncurses へのインタフェースを提供します。
Windows では 別のライブラリを追加でインストールする必要があるので、特別な理由がなければ、使用することはないでしょう。 code: curses_sample.py
import sys,os
import curses
def draw_menu(stdscr):
k = 0
cursor_x = 0
cursor_y = 0
# Clear and refresh the screen for a blank canvas
stdscr.clear()
stdscr.refresh()
# Start colors in curses
curses.start_color()
curses.init_pair(1, curses.COLOR_CYAN, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_WHITE)
# Loop where k is the last character pressed
while (k != ord('q')):
# Initialization
stdscr.clear()
height, width = stdscr.getmaxyx()
if k == curses.KEY_DOWN:
cursor_y = cursor_y + 1
elif k == curses.KEY_UP:
cursor_y = cursor_y - 1
elif k == curses.KEY_RIGHT:
cursor_x = cursor_x + 1
elif k == curses.KEY_LEFT:
cursor_x = cursor_x - 1
cursor_x = max(0, cursor_x)
cursor_x = min(width-1, cursor_x)
cursor_y = max(0, cursor_y)
cursor_y = min(height-1, cursor_y)
# Declaration of strings
subtitle = "Written by Clay McLeod":width-1 keystr = "Last key pressed: {}".format(k):width-1 statusbarstr = f"Press 'q' to exit | STATUS BAR | Pos: {cursor_x}, {cursor_y}")
if k == 0:
keystr = "No key press detected...":width-1 # Centering calculations
start_x_title = int((width // 2) - (len(title) // 2) - len(title) % 2)
start_x_subtitle = int((width // 2) - (len(subtitle) // 2) - len(subtitle) % 2)
start_x_keystr = int((width // 2) - (len(keystr) // 2) - len(keystr) % 2)
start_y = int((height // 2) - 2)
# Rendering some text
whstr = "Width: {}, Height: {}".format(width, height)
stdscr.addstr(0, 0, whstr, curses.color_pair(1))
# Render status bar
stdscr.attron(curses.color_pair(3))
stdscr.addstr(height-1, 0, statusbarstr)
stdscr.addstr(height-1, len(statusbarstr),
" " * (width - len(statusbarstr) - 1))
stdscr.attroff(curses.color_pair(3))
# Turning on attributes for title
stdscr.attron(curses.color_pair(2))
stdscr.attron(curses.A_BOLD)
# Rendering title
stdscr.addstr(start_y, start_x_title, title)
# Turning off attributes for title
stdscr.attroff(curses.color_pair(2))
stdscr.attroff(curses.A_BOLD)
# Print rest of text
stdscr.addstr(start_y + 1, start_x_subtitle, subtitle)
stdscr.addstr(start_y + 3, (width // 2) - 2, '-' * 4)
stdscr.addstr(start_y + 5, start_x_keystr, keystr)
stdscr.move(cursor_y, cursor_x)
# Refresh the screen
stdscr.refresh()
# Wait for next input
k = stdscr.getch()
def main():
curses.wrapper(draw_menu)
if __name__ == "__main__":
main()
# See ALso:
https://gyazo.com/159261a0fd4c3921ab3d4a70d2abe63c
Prompt-toolkit
prompt-toolkitを使うとTUIアプリケーションを作るためのフレームワークです。多彩な機能がありります。Linux系のプラットフォームだけでなく Windows でも動作します。 InquirerPy
ユーザに対する質問をdict型で定義してprompt()に与えるか、あるいは Inquirer()でマップされるクラスに引数を与えることでTUIが自動作成されます。
質問では次のようなタイプを指定することができます。
list: 選択肢を一覧表示してユーザにカーソルキーで選択させる。複数選択を許すとラジオボタンと同じ動作になる
rawlist:数値付きでリストした候補を数値で選択する
expand:はじめはコンパクトに表示し、キー操作で展開表示するリストプロンプト
checkbox:チョイスボックス
confirm:Yes/No の確認
input:プロンプトを表示してユーザから文字列を受け取る
password:inputと似ているがユーザの入力は表示されない
filepath:ファイルパスの補完機能があらかじめ組み込まれたUI
fuzyy:入寮文字列のあいまい検索機能を持つリストプロンプト
非常にシンプルなのですが、必要十分な機能を持っています。
ただし、フルスクリーン・アプリケーションを作成するためには力不足です。
Rich
rich は Python で実装されたTUIアプリケーションを作成するためのフレームワークです。 Jupyter notebook などからも使用することができます。
https://gyazo.com/5976c453947976fdb8151e441428b354
色とスタイルを柔軟に設定することができ美しい、フルスクリーンのTUIアプリケーションを作成することができます。
表形式の出力を簡単に定義できるTableクラスや、ストリーミング出力などは優秀です。
ただし、提供されているウィジェットが数なく、デフォルトではラジオボタンが提供されていないことは残念です。
Asciimatics
https://gyazo.com/04a172eae76684d06741f62853b86156
次のような機能を提供しています。
色とスタイルを適用したテキストを出力
カーソル位置の制御
キーボード入力(ブロックまたはエコーなし)
マウス入力
コンソールのサイズ変更時の検出と処理
スクリーンスクレイピング
アンチエイリアスASCII線画
画像(JPEGおよびGIF形式)からASCIIへの変換
多くのアニメーション効果
スプライト、パーティクルシステム、バナーなど。
TUI用のさまざまなウィジェット
ボタン、テキストボックス、ラジオボタン、DatePicker(日時指定)、TimePicker(時刻指定)など。
モジュール名からもわかるように、基本的にはテキストベース・ユーザインタフェースです。
スクリーン、レイアウト、フレーム、シーン、エフェクト(効果)を組み合わせ、ウィジェットを組み合わせて複雑な構成で、フルスクリーンのTUIを実装することができます。
また、画像をASCII文字に変換して表示するなど面白い機能があります。
npyscreens
npyscreens は単純なプログラムから複雑なマルチスクリーンアプリケーションまで、あらゆるTUIアプリケーションをすばやく開発するために十分に強力なフレームワークです。 単純なタスクを非常に素早く実行し、より大きなアプリケーションを作成する場合は、その工数を大幅に軽減するように設計されています。 単純なテキストフィールドからより複雑なツリーやグリッドビューまで、非常に沢山のバラエティーに富んだデフォルトウィジェットが提供されています。
https://gyazo.com/24e53ca8089d8ce9f6af4b796b51bf44
blessings
Blessingsは、curses ライブラリのラッパーライブラリで、cursesで制限となるいくつかの前提をなくし、美しいTUIコード書くことができます。curses ライブラリが利用できるプラットフォームで実行することができます。
スタイル、色、ちょっとした位置合わせを、必ずしも最初に画面全体をクリアすることなく、行うことができます。
blessed
Blessed は blessings をフォークしたプロジェクトで blessings と同じAPIを提供しています。いくつかの拡張が施されています。
どちらを使うか悩むのであれば、まず blessed を選択してみてください。
参考