コントロールオブジェクト入門

Wolfram言語にはコアとなる言語の一部として,多数のコントロールおよび関連構造が含まれている.これらのコントロールオブジェクトはWolfram言語全体で完全にシームレスにサポートされており,式が使えるところならどこででも使える.

これらのコントロールオブジェクトは,その動作とディスプレイがユーザの特定のニーズに合うように変更できる豊かなオプション環境も備えている.多くの場合,ユーザが思うようにディスプレイを扱うことができるので,任意のグラフィックデザイン指定に沿ったインターフェースが構築できる.

関数Manipulateはそのようなインターフェースのひとつであり,Wolfram言語式を詳しく調べるための簡単でパワフルな環境を提供する.実際,Manipulateはコントロールオブジェクトと他のレイアウト構成を使って,完全にWolfram言語で書かれている.多くのアプリケーションには,低レベルのコントロールオブジェクトやこのチュートリアルを使わずともManipulateを使うだけで十分である.しかし,既存のフレームワークでは満足できないようなアプリケーションを考えている場合は,直接コントロールオブジェクトを使うとよい.

このチュートリアルは,「Dynamicチュートリアル」で説明してあることには触れないので,まずそれを一読してからこのチュートリアルをご覧になるとよいだろう.

ボタン

間違いなく最も簡単なコントロールであるボタンコントロールは,マウスクリックを1つのアクションに関連付けている.Buttonの第1引数はボタン上に表示されるラベルであり,グラフィックスやタイプセットオブジェクト等,どのようなWolfram言語式でもよい.第2引数はボタンをクリックしたときに評価される関数である.評価はカーネル内部で実行され,この評価の出力は,付随するものが生成されない限り通常見られない.

次は変数を増大させる簡単なボタンで,その変数の値を動的に表示するためボタンクリックの効果を見ることができる.

In[7]:=
Click for copyable input
Out[7]=

Wolfram言語で行える評価はすべてボタンで実行できる.その評価はボタンが生成されたときではなく,ボタンがクリックされたときに起る(これがどのように行われるかという技術的な詳細については属性HoldRestのドキュメントを参照のこと).しかし,その評価の出力はShift+Return評価のためのものであるため,表示されない.したがって,ボタンの関数が可視の二次的効果を持たない限り,ボタンは何もしていないように見える.実際には動作しているのに見せていないのだ.次は同じ動作を実行する2つのボタンである.一方は新しいパレットウィンドウで結果が可視となるがもう一方は要求された評価をサイレントに行うだけである.

In[7]:=
Click for copyable input
Out[7]=

インターフェースを構築する場合,ボタンの外観を細かく調整したいことがある.これにはButtonAppearanceオプションを使う.Wolfram言語はプラットフォームの標準パレットボタン用にはを,ダイアログボックスボタン用にはデフォルトのを提供する.

Wolfram言語のボタンやその他のコントロールのデフォルトの外見は,オペレーティングシステムのものであることを述べておこう.そのため,コントロールの外観はWindowsとMacintoshとでは異なって見える.例えば,Macintoshでのダイアログボックスボタンは,ある最小サイズより小さくならないように設計されている.

この他にも,ボタンの周囲に枠を描画しないNone等の外観オプションが組み込まれている.これはButtonの第1引数を自分で指定してボタンの外観を完全にカスタマイズしたい場合に便利である.

以下はAppearance->Noneとしたボタンで生成される非常に簡単なインターフェースである.正方形のいずれかをクリックすると,円の色が変わる.はっきりとした枠がないボタンだと,ユーザにボタンだと認識されない可能性がある.このような場合は,明確にクリックできるような外観を作成することもできる.

In[8]:=
Click for copyable input
Out[8]=

Buttonには,この他にも特に便利なオプションが備わっている.例えば,Enabledオプションはボタンがマウスクリックを受け付けるかどうかを示す.EnabledFalseの場合,ボタンの色が薄くなりマウスクリックを無視する.

EnabledDynamicとの組み合せで最もよく使われる.マウスクリックが意味をなす間は,ボタンはマウスクリックを受付けて終了する.例えば,上記の増分ボタンに最大値を設定したいとしよう.一旦最大値に達すると,Enabledの設定は自動的にFalseとなりボタンの色が薄くなる.完全にするために,最小値で終了する減少ボタンも加え,すべてをDynamicModuleでラップして変数を隔離する.

In[12]:=
Click for copyable input
Out[12]=

日常的に複数のカーネルを使用している場合,あるいは直接フロントエンドを使用するボタンを作成したい場合は,Evaluatorオプションを知っておく必要がある.これはどのカーネルの名前に設定することもでき,現在のデフォルトカーネルを使うAutomatic(デフォルト)に設定することもできる.Evaluator->Noneでは,可能であればアクションがすべてフロントエンド内で起るようになる.詳細はFrontEndExecuteを参照のこと.

GridColumnの内部でButtonを使う場合,ImageSizeというオプションも知っておく必要がある.ボタンはデフォルトで格子の要素を満たすようにすべての方向に広がる.これはImageSizeのデフォルト設定Fullのためである.以下は,上の例を少し修正して,ボタンが含まれているColumnの幅が広がったときに自動的にボタンの大きさが変更されるようにしたものである.

In[13]:=
Click for copyable input
Out[13]=

この動作をオーバーライドするためには,ボタンが固定された自然な大きさのままとなるようにするAutomatic等,ImageSizeの別の設定を使う.また,固定されたImageSizeを使ってボタンの大きさをポイントで指定することができる.

In[14]:=
Click for copyable input
Out[14]=

Buttonのオプションの最後に説明するのはMethodである.Methodはボタンがカーネルと通信する方法を指定する.デフォルト設定のでは,ボタンクリックにより評価はプリエンプティブリンクを介してカーネルに送られる(プリエンプティブリンクの詳細は「Dynamicの高度な機能」を参照のこと).これは動的評価で使われるリンクと同じである.このようなボタンは,たとえユーザがメインリンクで長いShift+Return評価を実行していてもユーザのクリックに即時に応答する.

以下はこの設定のパワーを示すための簡単な例題である.まず,変数を初期化し,変数の値を変更するプリエンプティブボタンを表示する.

In[15]:=
Click for copyable input
Out[15]=

次にShift+Returnを使ってこのWhileコマンドを評価する.

In[16]:=
Click for copyable input
Out[16]=

通常,このWhileループを抜け出す唯一の方法は計算を放棄することである.しかし上記のボタンは異なるリンクでカーネルと通信しているため,このWhileループにより妨害されることはない.ボタンをクリックすると,変数の値を変更するプリエンプティブ評価が開始され,Whileループは終了する.

Method->"Preemptive"を使用すると,ボタン評価が他の動的評価と同じように,フロントエンドのDynamicEvaluationTimeoutオプションで指定されたタイムアウト時間の対象となるので,注意が必要である.このため,数秒以上かかるような評価を行う場合は,Method->"Queued"を使う必要がある.こうすると,ボタンのクリックによる関数の評価にメインリンクが使われるため,評価はShift+Returnを使った評価とともに待ち行列に入る.

例えば,以下のような非常に大きい出力抑制パネルの中のボタンではMethod->"Queued"を使う.非常に大きい出力を扱うにはかなりの時間が必要であるためである.

In[17]:=
Click for copyable input
Out[17]=

Button制御は非常に柔軟でパワフルであるが,これ以外にもよく使われるバリエーションがいくつかあり,そのバリエーションを生成するための簡単な関数が備わっている.

PasteButtonはペースト操作を実行するボタンを生成する.Hyperlinkは指定されたURIにジャンプするボタンを生成する.FileNameSetterはシステムのファイル選択ダイアログを開き,選択されたファイルのパスを記憶するボタンを生成する.ColorSetterはシステムの色選択ダイアログを開くボタンを生成する.

「PopupMenuとActionMenu」で出てくるActionMenuも,Buttonと似た機能があり,複数のアクションをメニュー項目の集合にすることができる.それぞれのメニュー項目はButtonの関数が実行されるのと全く同じように実行される別々の関数を持つ.

その他のコントロール

その他のコントロールの多くは,変数に関連付けられる,という幾分異なる目的を持つ.次に紹介するスライダーの例は,「Dynamicチュートリアル」に詳細が記されている.このチュートリアルで記述してある残りのコントロールのほとんどすべてはスライダーとこの機能を共有している.その主な目的は,変数の現在の値を表示し,コントロールが使用されたときにその変数の値を設定することである.

このようなコントロールはすべて同じ形の基本的なシンタックス形式を持つ.

control[Dynamic[var],domainSpec,opts]

ここでcontrolはコントロールの名前,var はコントロールが変更している変数,domainSpec はコントロールが動作する空間の指定(オプショナル),opts はコントロールがどのように動作し,どのように見えるかに影響を与えるオプションである.

コントロールはまた,すべてがプリエンプティブリンク上のカーネルとインタラクトするので,「PopupMenuとActionMenu」で説明する通り,他の動的ディスプレイと同様にMethod->"Preemptive"と設定したボタンと同じタイムアウトの対象となる.このことからも,コントロールは短時間で終了することを制御するためだけに使うべきだということが納得される.スライダーが実行に数分あるいは数時間かかるような評価を開始するなど,意味がない.ボタンの場合と同様に,このタイムアウトを避ける方法もある.それについては後ほど説明する.

スライダー

Wolfram言語には使用できるスライダーが多数ある.最も簡単なものは,0から1までの任意の数を選ばせる水平のスライダーである.ここでは変数にスライダーを関連付け,スライダーの効果がすぐに見られるようにこの値を動的に表示するようにしている.

In[9]:=
Click for copyable input
Out[9]=

Sliderの基本的な使い方は「Dynamicチュートリアル」で詳しく説明してあるが,あまり一般的でない使い方もある.例えば,修飾キーを押すと,スライダーのドラッグを遅くすることができる.この機能についての詳細は「Manipulateチュートリアル」に記述してある.

スライダーは連続値ではなく離散値の集合の中から選ぶようにすることもできる.次に示す4つのスライダーは,それぞれ0から10までの特定の値を選ぶことができる.最初のスライダーは実数を選ぶ連続スライダー,2つ目は整数値のスライダー,3つ目は1/3の倍数のすべての有理数を示すもので,4つ目は指定されたオブジェクト(任意の順序の整数,実数,任意の式等)の離散集合を範囲とすることができるSliderの機能を示す.

In[19]:=
Click for copyable input
Out[19]=

スライダーのつまみの位置は常に,もとになっている変数の値を表そうとする.変数の値がスライダーでは表せない場合,つまみはスライダーの片側に移動し,その背景色が赤っぽい色になって値が範囲外であることを示す.

Buttonのように,Sliderにも外観や使用法を変更するためのオプションが多数ある.Appearanceオプションは中でもスライダーのつまみの大きさと形を決定する.次は組込みのバリエーションのいくつかである.中にはスライダーの向きを変更する必要があるものもある(スライダーはオペレーティングシステムにより描画され,各オペレーティングシステムは多少異なる外観をサポートする.スライダーの外観が使用中のオペレーティングシステムでサポートされない場合,デフォルトの外観が使われる).

VerticalSliderも使うことができる.これを使うと自動的にAppearance->"Vertical"と設定される.

EnabledImageSizeについては,Sliderおよびその他のコントロールの項では繰り返し説明していないが,全く同じように機能する.唯一の違いはImageSize->FullButtonでのみサポートされ,他のコントロールではサポートされないことである.しかし,Sliderとその他のコントロールは記号的な画像サイズでも固定された数値の画像サイズでもサポートする.

外観は,ImageSizeの設定が異なると自動的に変更される.それはAppearance設定のデフォルト設定がAutomaticだからである.ImageSizeと異なるAppearanceとを組み合せたければ,そうすることもできる.ここではコンポーネントは中くらいのサイズで描画するが,全体のサイズは小さくなるよう制限する.

In[22]:=
Click for copyable input
Out[22]=

次はSliderの面白いバリエーションである.ManipulatorコントロールはSliderと全く同じシンタックスを持つが,表示に入力フィールドとアニメーションコントロールが加わる.これらはデフォルトでたたまれているが

アイコンをクリックすると開く(後ほど,Manipulatorとは別に入力フィールドとアニメーションコントロールを作成する方法を説明する).

In[23]:=
Click for copyable input
Out[23]=

Appearance->"Open"と指定すると,アニメーションコントロールを自動的に表示することができる.

In[24]:=
Click for copyable input
Out[24]=

ManipulatorAppearanceのユニークな設定をサポートする.通常のコントロールとともに,隠された部分の外側に枠のない入力フィールドを置くものである.このように変数の値を設定し,見ることは非常に便利な場合がある.

In[25]:=
Click for copyable input
Out[25]=

IntervalSliderは特殊なスライダーで,範囲の2点(通常上限,下限)の設定が可能である.IntervalSliderの値は,2つの終点のリストである.

In[3]:=
Click for copyable input
Out[3]=

このスライダーには,操作できるつまみが3つある.先端が上を向いた左側のつまみは下限を制御し,先端が下を向いた右側のつまみは上限を制御する.その間のスペースは区間全体を動かす3つ目のつまみとなる.

ここでは2つのスライダーがあるので,区間の一端のスライダーを反対側のスライダーを越えるように動かしてみたらどうなるだろうかということに対していくつかの場合が考えられる.デフォルトでは,一端が他方を越えることは可能であり,値の上限と下限の順が逆に表される.

In[4]:=
Click for copyable input
Out[4]=

上限と下限が逆になることを防ぐこともできる.これにはMethodオプションを使う.Method->"Stop"と設定すると,一方のつまみが,他方をインタラクティブに操作した場合の絶対的終点となる.

In[6]:=
Click for copyable input
Out[6]=

Method->"Push"と設定すると,動かしているつまみが他方のつまみを押し出す.下の例で,右側のつまみを左端まで動かしてみよう.

In[8]:=
Click for copyable input
Out[8]=

Animator,Trigger,ProgressIndicator

アニメーションはWolfram言語のもうひとつの重要な機能であり,それを管理するためのコントロールはAnimatorである.Animatorコントロールは,指定された領域の変数値を自動的に押し出す.ここではAnimatorの値を0から1として実行する.領域の最高値まで到達すると再び最低値から開始する.

In[10]:=
Click for copyable input
Out[10]=

これで分かるように,Animatorコントロールの表示にはAppearanceElementsといういくつかの異なる要素が含まれている.これには,変数の現在値を示すスライダー(),左あるいは右に少しだけ値を動かす'"-"と"+"のボタン(それぞれ),Animatorの動作/休止をボタン(),アニメーションのスピードと向きを制御するボタン(それぞれ)がある.必要に応じて,これらのいくつかだけを含むようにAppearanceElementsを変更することができる.次は同じアニメーションであるが,Animatorは「プレイ」ボタンしか表示していない.

In[11]:=
Click for copyable input
Out[11]=

アニメーションのこのような要素のそれぞれのコントロールを示す以外に,Animatorはこれらのコントロールの初期状態を設定するためのオプションを提供する.AnimationRunningを使うと,アニメーションを休止状態で開始することができる.AnimationDirectionではアニメーションの最初の方向を設定することができる.DefaultDurationAnimationRateではアニメーションの速度を指定することができる.

AnimatorSliderがその第2引数でサポートするのと同じ領域すべてをサポートする.さらにAnimatorでは maxInfinityに,min-Infinityにすることもできる.

In[12]:=
Click for copyable input
Out[12]=

アニメータについて留意しなければならない点がある.他の動的要素と同様に,アニメータも,スクリーン上に見えているときだけアクティブであるという点である.Animatorが閉じたセルグループの中にあったり,スクロールされてスクリーンから消えたり,他の隠れた場所にあったりするときは,対応する変数を変更しない.このドキュメントをオンラインでご覧になっている場合,下のセルグループを開くと y の値が更新される.

In[13]:=
Click for copyable input
Out[13]=
In[30]:=
Click for copyable input
Out[30]=

次は継続時間についてである.アニメーションの速度を制御するにはいくつかの方法がある.デフォルトでは,アニメーションはドメインの初めから終りまで5秒で済むような速さになっている.この時間はDefaultDurationオプションで決められる.以下に,このオプションを使った2つのアニメーションがある.1つはもう一方の2倍の速さである.

In[29]:=
Click for copyable input
Out[29]=

全体の継続時間を指定する代りに,Animatorのオプショナルの第3引数を使い,秒速何ユニットでアニメーションを実行するかを指定することができる.この第3引数はAnimationRateオプションの設定に便利である.無限のアニメーションに継続時間を設定することは無意味なので,無限のアニメーションには特に便利である.

In[30]:=
Click for copyable input
Out[30]=

DefaultDurationAnimationRateは最終的には同じこと,つまりアニメーションの速度を指定する.デフォルトでAnimationRunningAutomaticに設定されており,DefaultDurationオプションが尊重される.AnimationRateがこれ以外に設定されている場合(Animatorの第3引数に数値を入れた場合等)は,DefaultDurationは無視される.

DefaultDurationAnimationRate以外で,他に指定できるのはRefreshRateである.これはAnimatorが変数の値を1秒間につき何回変更するかを指定する.デフォルトではAnimatorは可能な限り速く実行されるため,常にCPU時間を必要とする.RefreshRateの設定を低くすることにより,カーネルは他の評価に利用できる時間を多くすることができる.以下の3つのアニメータは異なる更新レートを使っている.3つとも最小から最大まで5秒かかるが,更新レートが低いものはアニメーションで示す値が少ない.

In[31]:=
Click for copyable input
Out[31]=

DisplayAllStepsオプションも必要に応じてDefaultDurationAnimationRateをオーバーライドする.Trueに設定されているときは,許された時間内で行えるかどうかにかかわらず,離散ドメインのすべての要素がアニメーションに表示される.

In[32]:=
Click for copyable input
Out[32]=

要素のリストをアニメーションにするためにAnimatorを使う場合,それぞれのフレームに対する相対的なフレーム継続時間を指定するためのシンタックスがある.フレームのリストを提供する代りに,各要素 をペアで置き換える.ここで は対応する要素の相対継続時間である.

In[33]:=
Click for copyable input
Out[33]=

最後に,AnimationRepetitionsは自動的に終了する前に何度アニメーションを実行するかを示す.デフォルトはAnimationRepetitions->Infinityで示されるように,無限にアニメーションを反復することであるが,任意の有限値に設定することができる.次は2回実行して終了するAnimatorである.

In[34]:=
Click for copyable input
Out[34]=

Triggerは実際にはAnimatorの変形であり,ドメインから1度変数を押し出してから終了する.Triggerは常に最初から始まらなければならないアニメーションを対象としたものである.したがって,Triggerには休止ボタンがあるが休止解除のボタンはない.他にはリセットボタンとメインの実行ボタンがある.

In[14]:=
Click for copyable input
Out[14]=

SliderAnimatorに類似した別のコントロールにProgressIndicatorがある.ProgressIndicatorはその名の通り,ほとんどのプラットフォームで温度計のように描画される,プラットフォーム標準のプロブレスバーを表示する.そのシンタックスはAnimatorおよびSliderと同じであり,表示する値は他のコントロールと同様に,動的変数を介して通信される.ここではPauseを使った時間のかかる評価を進行状況を表示しながらシミュレートする.

In[38]:=
Click for copyable input
Out[38]=

温度計表示が適切でないような中級の計算では,ProgressIndicatorに無限を指定することができる.こうすると,いつ終了するかということを示さずに何かが起っていることだけが示される.

In[40]:=
Click for copyable input
Out[40]=

さらにこのような場合に利用できる,より高レベルな関数Monitorがある.Monitorはすべてを監視している式として表示することができるが,ProgressIndicatorは特に便利である.Monitorを使うと,第1引数の評価が終了すると,監視している式が自動的に削除されるという非常によい機能が利用できる.

In[87]:=
Click for copyable input

Slider2DとColorSlider

上記のような一次元のスライダー状コントロールは便利であるが,点の座標のような基本的に二次元データであるものを制御したい場合はどうすればよいであろうか.そのような場合のためには,指定された部分のどこにでもスライダーのつまみを動かすことのできるSlider2Dがある.

In[43]:=
Click for copyable input
Out[43]=

Slider2Dの基本シンタックスはSliderと同じであるが,最小値と最大値が1つの数値ではなく数値のペアである点が異なる.オプショナルで刻み幅を与えることもできる.

In[44]:=
Click for copyable input
Out[44]=

すべてのコントロールと同様に,Slider2DEnabledImageSizeのようなオプションを取る.ImageSizeはデータの縦横比にマッチするようスライダーの縦横比を変更するのにこの場合,特に便利である.

In[45]:=
Click for copyable input
Out[45]=

二次元空間を移動する別のスライダーにColorSliderがある.これを使うと,右側にある色のグラデーション上をクリック・ドラッグすることで色を選ぶことができる.ColorSliderの左側の単色の正方形をクリックすると,システムの色選択ダイアログを開くことができる.

In[46]:=
Click for copyable input
Out[46]=

Checkboxと他の切換えコントロール

2つ以上の値から変数の値を切り換えるのに1つのコントロールを使いたい場合は,CheckboxTogglerを使う.以下はCheckbox[Dynamic[var]]が変数 var の値をTrueFalseにどのように切り換えるかを示した簡単な例である.

In[47]:=
Click for copyable input
Out[47]=

オプショナルの第2引数を使うと,TrueFalseだけではなく値の任意のリストをチェックボックスで切り換えることができる.Shift+ Clickを使うと前の値に戻る.ここではCheckboxを使い,プロット軸に可能な他の設定を反復させる.また,DynamicModuleを加えて,前の例とこの例を区別する.

In[48]:=
Click for copyable input
Out[48]=

チェックボックスが取る値をカスタマイズすることはできるが,その表示はカスタマイズできない.TogglerCheckboxの一般形であり,切換えコントロールの表示を完全にカスタマイズすることができる.

In[49]:=
Click for copyable input
Out[49]=

最後に,チェックボックスと切換えボタンをすべて同時に構築するための便利な方法を紹介する.TogglerBarは実際のボタンのバーに並んだコントロールを示すのに対して,CheckboxBarはラベルの付いた一団のチェックボックスを提供する.この場合,変数の値はクリックの順に現在チェックされている,あるいは切り換えられている項目のリストとなる.

In[50]:=
Click for copyable input
Out[50]=

もちろん一旦ラベル付きのコントロールを設定し始めると,どのようにそれらをレイアウトするかという問題が生じてくる.CheckboxBarTogglerBarではAppearanceに設定し,さまざまなレイアウトと改行動作にすることができる.

In[51]:=
Click for copyable input
Out[51]=

OpenerコントロールはCheckboxの別のバリエーションであり,チェックボックス付き,またはなしのボックスを表示する代りに,右か下を向いた三角形を表示する.変数に割り当てられる値はCheckboxと同様にブール値である.

In[52]:=
Click for copyable input
Out[52]=

次の形式的な例は,Openerコントロールの表示によりその下に何かが現れると思わせるので,視覚的にはあまり意味がない.Openerは実際は,内部的にOpenerPaneSelectorおよびGridを一緒に使うことによりこの垂直のレイアウトを自動的に提供するOpenerViewの中で主に使用される.

In[53]:=
Click for copyable input
Out[53]=

OpenerViewおよび他のビューオブジェクトについては,「ビュー」を参照していただきたい.

In[54]:=
Click for copyable input
Out[54]=

RadioButtonと他の設定コントロール

別の便利なインターフェース構造に,丸ボタンがある.これを使うと,ユーザは集合内の1要素だけを選ぶことができる.Wolfram言語関数で丸ボタンを生成するのはRadioButtonである.以下は,選ばれるとxに設定する丸ボタンである.

In[15]:=
Click for copyable input
Out[15]=

もちろん1つの丸ボタンはそれだけではたいして便利ではない.一旦押すともう戻すことはできない.同じ変数に2つ以上の丸ボタンを接続すると,丸ボタンをインターフェース要素として区別する通常の多者択一効果が生まれる.

In[16]:=
Click for copyable input
Out[16]=

丸ボタンの集合も,ラベルが付いていなければあまりよいものではない.同じ変数に基づくすべての丸ボタンとすべてのラベルを指定するまでに,大変な無駄が生じる.Wolfram言語は同じ変数に関連付けた一団の丸ボタンを生成する関数RadioButtonBarを提供する.それぞれの丸ボタンのラベルはデフォルトでは値自体であるが,指定することができる.

In[17]:=
Click for copyable input
Out[17]=

より複雑なインターフェースでは,完全にカスタマイズされた表示を与えるという柔軟性を備えると,丸ボタンの多者択一動作が便利なこともある.そのためにSetter構造がある.これは,デフォルトで選ばれているときには丸ボタンが選ばれているときと同じように見え,逆もまたしかりのボタンのようなものである.

In[18]:=
Click for copyable input
Out[18]=

さらに同じ変数に関連付けられた一団のSetterを生成する便利な関数SetterBarがある.SetterBarではAppearanceオプションのデフォルト設定がSetterとは異なるため,外観はプラットフォームにより異なる場合がある.デフォルトの外観の場合,SetterBarは具体化されていないTabViewコントロールと考えるとよい.

In[19]:=
Click for copyable input
Out[19]=

以下は設定バーに対してグラフィカルなラベルを使用する例である.

In[60]:=
Click for copyable input
Out[60]=

RadioButtonBarSetterBarCheckboxBarTogglerBarが取るのと同じAppearance設定のを取る.

PopupMenuとActionMenu

ここまで,丸ボタンの生成および使用方法を見てきた.しかしボタンが多いとかなり使いにくくなることがある.集合の中から1つの要素を選ぶことのできる別のコントロールに,ポップアップメニューがある.PopupMenu関数はRadioButtonBarおよびSetterBarと全く同じシンタックスを持ち,インターフェースは異なるものの同じ機能を提供する.

In[20]:=
Click for copyable input
Out[20]=

PopupMenuは項目の代りに,2つの項目の間に線を引くシンボルDelimiterを取ることもできる.これは,要素を視覚的にグループ化するのに便利である.デリミタはシステムのポップアップメニューと同様に,折りたたまれたポップアップメニューでは選んだり表示したりすることはできない.

In[21]:=
Click for copyable input
Out[21]=

このシンタックスを使って,変数に割当てられる値とメニューの表示とを別にすることができる.例えば,以下は数値を変数に関連付けるが,メニューでは実際の言葉を表示するメニューである.

In[22]:=
Click for copyable input
Out[22]=

一旦ポップアップメニューから何かを選択すると,ポップアップメニューはその選択項目を覚える.それは折りたたまれたポップアップメニューに表示されるだけでなく,プラットフォームによってはメニューが開かれたりポップアップしたときにチェックマークがついていることもある.

さらにポップアップメニューをカスタマイズするために,動的変数の値が第2引数にリストされた値の中のひとつではない場合に表示するラベルを指定することができる.これはオプショナルの第3引数を使って行う.

In[24]:=
Click for copyable input
Out[24]=

最後になったが,第4引数はクリックされていないときのPopupMenuの任意表示を指定することができる.第4引数を使うことで,メニューがコントロールの枠や色のようなシステム特有のものを描画しないようにすることができる.従って,ユーザにカスタム表示をクリックしたいと思わせるかどうかはデベロッパ次第である.

In[25]:=
Click for copyable input
Out[25]=

選択させるような丸ボタンを提供することが目的ではなく,選択された項目に関連付けられたアクションを実行することが目的となっているもう一種類のメニューがある.Wolfram言語ではこの構造はActionMenuとして知られている.ActionMenuは,選択されたメニュー項目によっていくつかの関数のうちの1つを評価する,ある種のマルチボタンと考えるとよい.また,この関数にも,Buttonと同じように,二次的効果以外にはアクションが実質的に不可視である等の注意すべき点がある.

In[28]:=
Click for copyable input
Out[28]=

ActionMenuのシンタックスではRuleDelayed () が使われ,ユーザが実際にアクションを選択するまでは評価されないようにする.つまり,PopupMenuと異なり,ActionMenuではラベルを指定することはオプショナルではなく,シンタックスに組み込まれた部分なのである.

ActionMenuにもメニューの全体的な表示を変更するために使えるAppearanceオプションがある.以下は,より便利な外観を示す簡単なManipulateである.

最後に言及しておきたいのは,ActionMenuはアクションを評価する方法を決めるのに,Buttonで使用されるのと同じMethodオプションを取るということである.デフォルトのオプション設定Method->"Preemptive"ではアクションは直ちに評価されるが,評価にかかる時間がDynamicEvaluationTimeoutオプションで指定された時間以上になる場合は評価は放棄される.かなり時間のかかるアクションを伴うActionMenuではオプションMethod->"Queued"を使い,評価を通常の評価待ち行列に入れ終了するまで実行させるべきである.

InputField

InputFieldコントロールは,ユーザがどのような式でも入力できるという点でユニークである.最も簡単な例として,与えられた式を指定された動的変数に関連付けるだけというものがある.

In[35]:=
Click for copyable input
Out[35]=

しかしながら,InputFieldにもそれに関連したユニークな問題がある.例えば,アプリケーションによっては数値だけ,文字列だけ,または任意のタイプセットや式だけを許すような入力フィールドの方がよい場合がある.これを行う方法はいくつかある.最も簡単な方法は,すでに定義されたInputFieldのタイプの中のひとつを第2引数で指定することである.タイプがNumberの入力フィールドには数値以外の何もタイプすることができない.

In[36]:=
Click for copyable input
Out[36]=

任意の式は任意量の画面サイズを使用してしまうこともあり,デフォルトでInputFieldはそれを満たすよう大きくなる.FieldSizeオプションを使うと,InputFieldの縦横両方向についての最小および最大のサイズを指定することができる.デフォルトではInputFieldは幅20emに制限されているが,高さについては必要分だけ拡張される.

In[37]:=
Click for copyable input
Out[37]=

他のほとんどのコントロールよりもInputFieldに深く関連する別のオプションにContinuousActionがある.デフォルトではInputFieldEnterまたはTabキーが押されるまでは新しい値を使用しない.しかし,NumberStringBoxesタイプのInputFieldではContinuousAction->Trueと設定して,毎回キーを押すたびに新しい値を自動的に使用させることができる.

In[38]:=
Click for copyable input
Out[38]=

ContinuousAction->Trueと設定すると,「Dynamicチュートリアル」で説明してあるようにDynamicの第2引数を使って,ユーザがタイプすることのできる,あるいはできない文字のフィルタを指定することもできる.例えば,次のInputFieldToUpperCaseを使って入力を大文字に強制する.

In[40]:=
Click for copyable input
Out[40]=

最後に,枠のない入力フィールドとポップアップメニューを組み合せた新しいコントロールを構築する.

In[41]:=
Click for copyable input
In[42]:=
Click for copyable input
Out[42]=