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 クラスについての詳細は、上記の例にあるコメントを参照してください。