5.6.3. テキスト形式のユーザーインターフェイス
Anaconda は Kickstart および GUI のほかに、テキストベースのインターフェイスもサポートしています。このインターフェイスは機能面では制限がありますが、システムによってはこれが唯一の対話式インストール方法となることがあります。テキストベースインターフェイスとグラフィカルインターフェイスの違い、および TUI の制限の詳細については、次を参照してください。「Anaconda の概要」 .
アドオンにテキストインターフェイスのサポートを追加するには、次の説明に従って、
tui
ディレクトリーの下に一連の新しいサブパッケージを作成します。「Anaconda アドオンの構造」 .
インストーラーでのテキストモードのサポートは
simpleline
ユーティリティーをベースとしており、これは非常にシンプルなユーザーの対話のみを可能にするものです。これはカーソルの操作はできず (ラインプリンターのような動作になります)、色およびフォントのカスタマイズといった視覚的拡張機能もありません。
内部的には、
simpleline
ツールキットには、App
、UIScreen
、Widget
の 3 つの主要クラスがあります。画面に表示 (プリント) する情報を格納しているユニットである Widget は、App
クラスの単一インスタンスで切り替えられる UIScreens に配置されます。基本的な要素のほかには hubs、spokes および dialogs があり、これらはすべてグラフィカルインターフェイスと同様の各種ウィジェットを格納しています。
アドオンで最重要となるクラスは
NormalTUISpoke
と pyanaconda.ui.tui.spokes
パッケージで定義される他の各種クラスです。これらのクラスはすべて TUIObject
クラスに基づいています。それ自体は、前の章で説明した GUIObject
クラスと同等です。各 TUI スポークは、NormalTUISpoke
クラスを継承する Python クラスであり、API で定義される特別な引数とメソッドをオーバーライドします。テキストインターフェイスは GUI よりも簡単なため、引数は以下の 2 つのみになります。
title
: GUI のtitle
引数の場合と同様に、スポークのタイトルを指定します。category
: スポークのカテゴリーを文字列として判別します。カテゴリー名はどこにも表示されず、グループ化にのみ使用されます。注記カテゴリーは GUI とは異なる処理です。[5] 既存のカテゴリーを新しいスポークに割り当てることが推奨されます。新しいカテゴリーを作成するには、Anaconda にパッチを適用する必要があり、ほとんどメリットがありません。
また、各スポークは
__init__
、initialize
、refresh
、refresh
、apply
、execute
、input
、prompt
、および プロパティー (ready
、completed
、mandatory
、および status
) をオーバーライドすることが期待されています。これらはすべて、「グラフィカルユーザーインターフェイス」 .
以下ではシンプルな TUI スポークを Hello World のサンプルアドオンに実装する例です。
例14 シンプルな TUI Spoke の定義
ancestor の
__init__
のみを呼び出す場合は __init__
メソッドを上書きする必要はありませんが、この例のコメントでは、一般的な方法でスポーククラスのコンストラクターへ渡された引数を記述します。
initialize
メソッドはスポークの内部引数のデフォルト値を設定し、これは refresh
メソッドで更新され、 Kickstart データの更新に apply
メソッドが使用します。この 2 つのメソッドが GUI のものと違う点は、refresh
メソッドの戻り値のタイプ (None ではなく bool) と、それらが取る追加の args
引数のみです。返された値の意味はコメントで説明されています。このスポークにユーザー入力が必要かどうかに関係なく、アプリケーション (App
クラスインスタンス) に指示します。追加の args
引数は、スポークに追加情報を渡す予定の場合に使用されます。
execute
メソッドは、GUI の同等のメソッドと同じ目的で、この場合はメソッドは何もしません。
input
と prompt
メソッドはテキストインターフェイスに固有のものです。キックスタートまたは GUI には同等のものはありません。この 2 つのメソッドはユーザーの対話に使用されます。
prompt
メソッドは、スポークのコンテンツがプリントされた後に表示されるプロンプトを返します。このプロンプトに文字列を入力すると、これが input
メソッドに渡されて処理されます。input
メソッドはこの文字列のタイプと値に応じてアクションを実行します。上記の例は任意の値を要求してから、それを内部属性 (key
) として保存します。より複雑なアドオンでは通常、c
を "continue" または r
を "refresh" として解析する、数字を整数に変換する、新たな画面を表示するもしくはブール値を切り替えるなど、簡単ではないアクションを実行する必要があります。
input
クラスの戻り値は、INPUT_PROCESSED
か INPUT_DISCARDED
の定数 (これらは両方とも pyanaconda.constants_text
モジュールで定義) となるか、もしくは 入力文字列そのもの (この入力が別の画面で処理される場合) である必要があります。
グラフィカルモードとは対照的に、スポークを離れる際に
apply
メソッドは自動的に呼び出されません。input
メソッドから明示的に呼び出す必要があります。同じことがスポークの画面閉鎖 (非表示) にも該当し、これは close
メソッドの呼び出しで実行します。
別の画面を表示するには (例えば、別のスポークで入力された追加情報が必要な場合など)、別の
TUIObject
をインスタンス化し、self.app.switch_screen*
の App
メソッドの 1 つを呼び出します。
テキストベースのインターフェイスの制限により、TUI スポークは非常によく似た構造を持つ傾向があり、ユーザーがチェックまたはチェックを外して入力する必要があるチェックボックスまたはエントリーの一覧で設定されます。以前の段落では、メソッドが利用可能かつ提供されるデータの出力と処理に対処する TUI スポークを実装する方法が示されました。しかし、
pyanaconda.ui.tui.spokes
パッケージから EditTUISpoke
クラスを使用し、これを実行する別の方法があります。このクラスを継承すると、設定するフィールドと属性を指定するだけで通常の TUI スポークを実装できます。以下の例ではこの方法を示しています。
例15 EditTUISpoke を使ったテキストインターフェイスのスポークの定義
補助クラス
_EditData
は、ユーザーが入力した値を保存するデータコンテナーとして機能します。HelloWorldEditSpoke
クラスはチェックボックス 1 つとエントリー 2 つの簡単なスポークを定義し、これらはすべて Entry
クラスとしてインポートされる EditTUISpokeEntry
のインスタンスになります。最初のインスタンスはスポークが表示されるたびに表示され、2 つ目のインスタンスは 1 つ目に空以外の値が含まれる場合にのみ表示されます。
EditTUISpoke
クラスについての詳細は、上記の例にあるコメントを参照してください。