モダンなTUIフレームワークを構築しながら学んだ7つのこと
ターミナルは速い
- モダンなターミナルエミュレーターは非常に洗練されたソフトウェア
- ハードウェアアクセラレーションレンダリングを使うことで画面のちらつきを減らせる
- ちらつきを減らす3つのテクニック:
- 画面を消去せず上書きする
- 標準出力へまとめて一度に書き込む
- Synchronized Outputプロトコルを使う
- Textualはデフォルトで60fpsを使用し、滑らかなアニメーションを提供する
DictViewsは驚き
- Pythonのdictsの
keys() と items() メソッドはKeysViewとItemsViewを返す
- ItemsViewオブジェクトの対称差を使うことで、変更された項目を簡単に見つけられる
- Textualでは、CSSプロパティが変更されたときの最適化された更新に使われている
lru_cache は速い
- functoolsモジュールの
@lru_cache デコレーターは関数の戻り値をキャッシュする
- Textualでは頻繁に呼ばれる小さな関数に
@lru_cache を使って性能を向上させている
- キャッシュ情報 (
cache_info()) を確認して、キャッシュが効果的かどうかを確かめるべき
不変オブジェクトは最高
- Pythonのタプル、NamedTuples、またはfrozen dataclassesを使うことで不変オブジェクトの利点を得られる
- 不変オブジェクトを使えば副作用のないコードを書けるため、テストやキャッシュが容易になる
Unicodeアートは良い
- Unicodeのボックス描画文字を使った図はドキュメント化に非常に有用
- よく書かれたdocstringと一緒に使うと大いに役立つ
分数は正確
- Pythonのfractionsモジュールは浮動小数点誤差を避けられる
- Textualでは画面を比率に応じて分割するとき、分数を使って正確なレイアウトを実現している
絵文字はひどい
- ターミナルでの絵文字サポートは予測不能で複雑
- Unicodeデータベースを使って絵文字の幅を確認するが、最新の絵文字は予測できない結果を招くことがある
- 複数コードポイントの絵文字はさらに大きな問題を引き起こす
GN⁺のまとめ
- この記事はPythonのターミナルアプリケーション開発で役立つヒントとテクニックを提供する
- Textualフレームワークの開発経験を通じて得た実践的な助言を共有する
- 絵文字のような複雑な問題への対処法を説明し、開発者の助けになる
- 類似した機能を持つプロジェクトとしてはurwidとprompt_toolkitがある
1件のコメント
Hacker Newsの意見
TUI開発者は、Unicode・国際文字・絵文字の処理を別プロジェクトとして扱うことになる
Textual が React を模倣しようとしている点が不満
Textual を使ってみた結果、CSS を使わなければならない
この TUI はきれいだが、実際に使う場面が思い浮かばない
kitty はより多くの機能を提供する
ソフトウェアエンジニアが、なぜ TUI にそれほど関心を持つのか理解できない
Monodraw は MacOS 専用だが、他のプラットフォームにも良い代替がある
「上書きして、消さない」は昔のゲーム開発のやり方だった
ターミナルでカーソル位置を確認して Unicode バージョンを推定する方法がある
複数の TUI ライブラリを評価した結果、FTXUI が最も使いやすく信頼できた