この章では SAD/Tkinterに備え付けられている各種の部品にある程度共通する操作の概要を紹介します。 現在までに組み込まれている部品は次の表のとおりです。
| 部品 | 機能 | コマンド | 結合変数 |
| Window | 各種部品を収容するウインドウ | ||
| Frame | 各種部品を収容する枠 | ||
| Button | 単純なボタン | Command | TextVariable |
| CheckButton | ON/OFFのチェックマーク付ボタン | Command | Variable, TextVariable |
| RadioButton | 他者択一型のボタン | Command | Variable, TextVariable |
| TextLabel | 複数行のテキスト・ラベル | TextVariable | |
| TextMessage | フォーマット可能なテキスト | TextVariable | |
| Entry | 文字列の入力枠 | TextVariable | |
| ListBox | 複数行の文字列からなる選択箱 | ||
| ScrollBar | スクロール・バー | ||
| Menu | プルダウン・メニュー | PostCommand | |
| MenuButton | Menuを割り付けるためのボタン | ||
| Scale | スライド・スケール | Command | Variable |
| Canvas | グラフィック出力用の画面 | ||
| TextEditor | 様々な修飾が可能なテキスト入出力 | ||
| OptionMenu | いくつかの選択枝から項目を選ぶ |
SAD/Tkinterの部品
Button, CheckButton, RadioButton, TextLabel, TextMessage, Entry, Scale などの部品には、あるシンボルを結合変数として割り付けることができます。例えば、あるボタン d を
w = Window[]; d = Button[w, Width -> 20, TextVariable :> date]; update := After[1, date = DateString; update]; update;
のように定義したとします。ここで Width -> 20 はボタンの幅を20文字分確保することを指示しています。 TextVariable :> date が問題の結合変数の指定です。 このボタンには Text によるボタンの上に書くテキストの指示はなく、代わりにシンボル date が割り当てられています。つまり、以後シンボル date に何らかの値 (文字列) が割り当てられると、その値がこのボタンの表面に表示されることになります。実際、この例では第3行でシンボル update に式 After[1, date = DateString; update] を割り当てています。After は SAD/Tkinter の備え付けの関数で、その第1引き数の時間だけ(単位: 秒)だけ経過した後に第2 引き数の式の実行を予約するというものです。したがって、update が一度呼ばれると、その第2 引き数にはまた update が含まれていますから、結局 update はほぼ 1秒 に1回 ずつ繰り返し実行されます。シンボル DateString は SAD に備え付けの関数で、その時の時刻を文字列で返します。こうしてシンボル date には時刻の文字列が毎秒設定され、ボタン d の表示も毎秒更新されます。
結合変数は Entry のように、部品の側から入力したデータをプログラムの中で利用する場合にも有効です。
それぞれの部品にはXサーヴァで与えられる、マウス・クリックやキーボード入力などの多彩な動作 event にいかに反応するかを指定することができます。前述の、ボタンに対する Command の指定もそれの特殊な例ですが、より一般的には関数 Bind を用いることでどのようなイヴェントにも対応できます。Bind は
Bind[部品, イヴェント, 動作];
という書式で使います。例えば、
w = Window[]; d = Button[w, Text -> "Event"]; Bind[d, "<Enter>", Print[$Event]];
としますと、マウス・カーソルがボタン d の上に来たときに端末に $Event の内容が
{(Widget:>d),(Tag->""),(Type->"<Enter>"),(X->53),(Y->28),
(XRoot->769),(YRoot->722),(Height->0),(Width->0),
(Char->"??"),(KeySym->"??"),(SendEvent->0),(KeyCode->0),
(State->0),(KeySymNum->0),(Time->5202658)}
のように出力されます。$Event はあるイヴェントが発生する度にそのイヴェントの情報が自動的に割り当てられるシンボルです。$Event は実際には式の置換を行うための規則のリストの形をしています。表に $Event に現われるシンボルの意味を掲げます。
| シンボル | 値 | 意味 |
| Widget | シンボル | イヴェントを発生した部品 |
| Tag | アイテム番号を表わす文字列またはタグ | イヴェントを発生したアイテム |
| Type | イヴェントの型名 | 発生したイヴェントの型名 |
| X, Y | 数値(ピクセル) | マウスカーソルの部品内での位置 |
| RootX, RootY | 数値(ピクセル) | マウスカーソルのルートウインドウ内での位置 |
| Height, Width | 数値(ピクセル) | 部品の大きさ |
| Char | 文字 | 押されたキー |
| KeySym | 文字列 | 押されたキーを表す |
| KeySymNum | 数値 | |
| KeyCode | 数値 | 押されたキーのコード |
| Time | 数値 (msec) | 押された時刻、午前0時 = 0 |
$Event に現われるシンボル。
イヴェントの表現は一般には "<修飾子 - 修飾子 - 型 - 詳細>" とされています。イヴェントの型には表のようなものがあります。
| 型 | 動作 |
| Button, ButtonPress | マウス・ボタンの押し下げ |
| ButtonRelease | マウス・ボタンの解放 |
| Enter | マウス・カーソルが部品の内にはいる |
| Leave | マウス・カーソルが部品の外に出る |
| Motion | マウス・カーソルが部品の中で動く |
| Key, KeyPress | キーの押し下げ |
| KeyRelease | キーの解放 |
| Configure | Window の 位置、大きさなどの属性の変更 |
| Destroy | Window が 消去された |
| Expose | Window が 露出した |
| FocusIn | Window に焦点があった |
| FocusOut | Window から焦点が外れた |
イヴェントの型
Key, KeyRelease などにはキーの種類が詳細として付加されます。例えば、 "<Key-a>", "<a>", "a" などはどれもキー a の押し下げを表わしています。
またReturn, Escape, Up, Down, Left, Right 等々のKeySymも使うことができます。
イヴェントにはいくつかの修飾子をつけることができます それらはキーボードの修飾キーに対応したものや、ダブル・クリックなどを表わすためのものです。
| 修飾子 | 動作 |
| Control | コントロール・キー |
| Shift | シフト・キー |
| Lock | シフト・ロック・キー |
| Meta, M | メタキー |
| Alt | Alt キー |
| Button1 -- Button3 | マウス・ボタン1--3 |
| Double | ダブル・クリック |
| Triple | トリプル・クリック |
イヴェント修飾子
イヴェントのうち、キーの押し下げに関するイヴェントは焦点 focus の合っている部品のみが反応することができます。部品によっては Entry のようにその上でマウスクリックすることにより自動的に焦点が合う部品もありますが、そうでなければ自分で焦点を合わせなければなりません。ある部品に焦点を合わせるには、
部品シンボル[Focus$Set]
と、また、焦点を外すには
部品シンボル[Focus$None]
とします。
イヴェントの結合を解除したい場合には、
Bind[部品, イヴェント] または Bind[部品, イヴェント, ] または Bind[部品, イヴェント, Null]
とします。
前にも述べた通り、ある部品は
シンボル = 部品[親, 属性 -> 値, ...];
という形で最初につくられます。属性 -> 値 の部分は 属性 :> 値 という形をとる場合もあります。 以下、このように定義されたシンボルを「部品シンボル」と呼ぶことにします。ここで、親の部品を省略することも可能です。その場合は、図の ReturnToSAD のボタンが表示されている Window が親の部品とみなされます。
同じ属性を重複して指定した場合は、先に書いたものだけが用いられます。また、その部品に定義されていない属性を指定した場合は無視されます。
また、シンボルとしては単純なシンボルのほかに例えば a[1], a[1, 2, 3] などのような引き数付のシンボルでも構いません。 このような引き数付のシンボルは多数の部品を機械的に生成する場合に便利です。
なお、上記のように生成された部品シンボルには
Widget[シンボル、部品[親, 属性 -> 値, ...]];
という値が割り当てられます。従って、ある部品シンボルの頭部は常に Widget になります。
属性によっては、複数の値を要求するものもあります。その場合には値としてリスト {値1, 値2, ... } が用いられます。
ある部品が生成された後は、
部品シンボル[属性] = 値; または 部品シンボル[属性] := 値;
のようにして個別にその属性を変更することができます(個々の部品が具体的にどういう属性をもっているかは後述されます)。 値がリストになることもあります。 また、属性によっては、全然値を必要としないものもあります。その場合は単に
部品シンボル[属性];
と書きます。また、ある種の属性はその値を返すことできます。その場合は例えば
a = 部品シンボル[属性];
の様に使います。さらに、ある種の属性の場合には引き数を要求しながら値も返すというものがあり、その場合は
a = 部品シンボル[属性[引き数1, ...]];
とします。同一の属性でも書き方によって、値の設定、読み出しの両方を使い分けることができます。
また、一度に多数の属性を後から設定するには関数 Configure により
Configure[部品シンボル, 属性 -> 値, ...];
のようにします。
部品は一般にはその属性が設定されてもその瞬間には表示を変えません。そのためには、 Update[]、TkSense[]、TkWait[] などが呼ばれなければなりません。TkWait[] 実行中は部品の表示は定期的に更新されます。また Update[] は、それまでに定義したすべての部品を更新します。
部品の親子関係はその製作時の指定で決まります。 子供が親を指定する場合、親は既に必ず部品として製作されていなければなりません。 しかし、子供が必ずしも親の部品の内側に描かれる必要はありません。 例えば、Window を自分より小さな Button の子供とすることもできます。
さて、各部品にはいくつかの共通する属性があります。それらを表に列挙しておきます。このなかで、梱包関係の属性、Anchor, Expand, Fill, IPadX, IPadY, PadX, PadY, Side は Window には適用されません。
| 属性 | 値(単位) | 機能 |
| Focus$None | なし | その部品の焦点を外す |
| Focus$Set | なし | その部品に焦点を合わせる |
| Lower | なし | その部品のウインドウを背景にさげる |
| Raise | なし | その部品のウインドウを最全面にあげる |
| Anchor | "n", "ne", "e", "se", "s", "sw", "w", "nw", "center" | 梱包の際の部品の起点 |
| Expand | True, False | 梱包の際の周辺のすき間の拡張 |
| Fill | "x", "y", "both", "none" | 梱包の際の周辺のすき間の充填 |
| IPadX, IPadY | ピクセル | 梱包の際の部品の内部のすき間 |
| PadX, PadY | ピクセル | 梱包の際の部品の周辺のすき間 |
| Side | "top", "bottom", "left", "right" | 梱包の向き |
| TextAnchor | "n", "ne", "e", "se", "s", "sw", "w", "nw", "center" | 表示テキストの配置起点 |
| TextPadX, TextPadY | ピクセル | 表示テキストの回りのすき間 |
| Background | 色名称または "#RRGGBB" | 背景色 |
| BG | 〃 | Background の略称 |
| BorderWidth | ピクセルまたは単位付文字列 | 境界(立体表示される)の幅 |
| BD | 〃 | BorderWidth 略称 |
| Cursor | 形状文字列 | マウス・カーソルの形状 |
| Height | ピクセルまたは単位付文字列 | 部品の高さ |
| HighlightColor | 色名称または RGBColor[r,g,b] | 焦点が合った時の背景色 |
| Relief | "flat", "groove", "raised","ridge", "sunken | 枠の立体形状 |
| Width | ピクセル、文字数、または単位付文字列 | 部品の幅 |
各部品に共通な属性
表で「単位付文字列」とは、例えば 1 cm を"1c"、1 inch を "1i"などと表わすものです。 各属性の単位やデフォルト値は部品の種類によって異なります。以後、各部品の中で標準と異なるばあいにはそのつど示します。
属性 Relief で指定する、部品の枠の各種の立体形状を図に示します。
部品の枠の立体形状。Relief -> 形状 で指定する。
Font 属性により、文字のフォントを指定する場合は、例えば、
Font -> TextFont["times","italic","bold",12]
の様に指定します。 ただし、どのフォントが使用可能かはXサーヴァに依存します。
属性などで、色を指定する場合は、
Background -> "red" または Background -> RGBColor[1, 0, 0] または Background -> "#FF0000"
などとします。ここでどのような色名称が使えるかはXサーヴァに依存します。また、RGB指定は "#RRGGBB" のように16進表記の文字列を使うか、RGBColor[赤, 緑, 青]とします。ここで赤, 緑, 青は 0 がら 1 までの実数です。
ある部品にマウスカーソルが入ったときのカーソルの形状は属性 Cursor を使って、
Cursor -> "カーソル名" または Cursor -> "カーソル名 文字色" または Cursor -> "カーソル名 文字色 背景色"
のように指定することができます。ここでカーソル名称としては図にある備え付けの物のほかに、"@ファイル名" と書けばファイルからもロードできます。
備え付けのマウスカーソル
作成された各々の部品については WidgetInformation という関数を用いて各種の情報をうることができます。これは
a = WidgetInformation[部品シンボル, 属性]; または a = WidgetInformation[部品シンボル, 属性, id];
のように書きます。指定可能な属性は表に掲げます。
| 属性 | 機能 |
| Geometry | その部品のサイズおよび位置(ピクセル)、"WWWxHHH+dX+dY" |
| Height | その部品の高さ(ピクセル) |
| Width | その部品の幅(ピクセル) |
| X, Y | その部品のウインドウ内の水平、垂直位置(ピクセル) |
| RootX, RootY | その部品のスクリーン内の水平、垂直位置(ピクセル) |
| Screen | その部品の表示スクリーン( DISPLAY 変数) |
| ScreenDepth | その部品の表示スクリーンのビット数 |
| ScreenHeight, ScreenWidth | その部品の表示スクリーンの高さ及び幅(ピクセル) |
| ReqHeight, ReqWidth | その部品のウインドウに必要な最小高さ、幅 |
WidgetInformation の属性
また、属性をリストにして
a = WidgetInformation[部品シンボル, {属性1, 属性2, ...}];
の様にすると結果が属性1, 属性2, ... に対応するリストとして返されます。例えば、
w = Window[];
WidgetInformation[w, {ScreenWidth, ScreenHeight}]
Out[1]:= {2304,1720}
のような具合です。
プログラムの終了、切り替えなどですでに製作した部品を必要としなくなった場合には、必ず
DeleteWidget[部品シンボル1, 部品シンボル2, ... ];
のように、関数 DeleteWidget により、不要な部品を消去してください。また、
部品シンボル1 =.
は DeleteWidget[部品シンボル1] と同様の働きをします。
ある部品に結合した結合変数は、その変数を最初に結合した部品を消去した時に自動的に消去されます。また、結合変数は
DeleteVariable[変数1, 変数2, ... ];
のように、DeleteVariable} を使って消去することもできます。
前にも述べましたが、SAD/Tkinter の部品はただ定義しただけでは表示も何もされません。表示、更新、イヴェントへの反応などは通常、関数 TkWait[], TkSense[]、あるいは Update[] が呼ばれたときにだけ起こります。