SAD/Tkinter では、ユーザーがこれまで説明してきたようなシステムに備え付けの部品を組み合わせて新しい部品を定義して備え付けの部品と似たように使うことができます。
いま、単純な例として、TextLabel と Entry を組み合わせた LebeledEntry という部品を定義したいとします。この部品はある Frame のなかの左側に TextLabel を、その右に Entry を並べるだけのものです。そのひとつの方法は、例えば
(a_ = LabeledEntry[w_, opt___]) ^:= ( (ア)
DeleteWidget[a]; (イ)
Clear[a]; (ウ)
a[Frame] = Frame[w, opt]; (エ)
a[Label] = TextLabel[a[Frame], Side -> "left", opt]; (オ)
a[Entry] = Entry[a[Frame], Side -> "left", opt]; (カ)
a[b_] := (
a[Frame][b]; (キ)
a[Label][b]; (ク)
a[Entry][b]); (ケ)
(a[b_] = c_) ^:= (
a[Frame][b] = c; (コ)
a[Label][b] = c; (サ)
a[Entry][b] = c); (シ)
(a[b_] := c_) ^:= (
a[Frame][b] := c; (ス)
a[Label][b] := c; (セ)
a[Entry][b] := c); (ソ)
);
のようなものになるでしょう。ここで、まず、(ア)は、この LabeledEntry という新しい部品が普通の部品と同様に
シンボル = LabeledEntry[親, オプション, ...]
(イ) と (ウ) はシンボル a などにそれまでに割り当てられているかもしれない部品や値の割り当てを解除しています。
この LabeledEntry という部品は Frame, TextLabel, Entry という 3つの従属部品から成り立っていますが、それらの従属部品の定義が (エ)--(カ) です。 左辺の形はそれらが従属部品であることにふさわしい書き方ではないでしょうか。 ここで、オプション opt は 3 つの従属部品に共通にあたえられています。 つまり、この 3 種のいずれにも同じ属性が指定されます。 例えば、Background という属性は3 つに共通ですからどれにも当てはまります。 しかし、例えば Text という属性は TextLabel にしかありませんから TextLabel だけに適用され、ほかの部品では無視されます。 また、Side という属性は (オ) (カ) の様に TextLabel と Entry では 先に書いた Side -> "left" が優先されるため、Frame に対してだけ有効となります。 もし、属性を個別に設定したければ、例えば
シンボル[Entry][属性] = 値
のようにすればよいのです。
さて、(キ) から (ソ) まではこの LabeledEntry 全体に対して共通の操作、 属性の変更を普通の部品と同様の形式で行えるようにするためのいくつかの定義です。
この LabeledEntry を使って、例えば
w = Window[]; le1 = LabeledEntry[w, Text -> "username: ",Side->"top"]; le2 = LabeledEntry[w, Text -> "password: ",Side->"top", ShowText -> "*"];
とすると図のようなパネルが作られます。
図 合成された部品LabeledEntryの例
なお、このLabeledEntry で作られた部品全体を DeleteWidget で消去することもできます。
以上のように、LabeledEntry のような簡単な場合には部品の合成はほぼうまくいきます。 さらに複雑な場合にどの程度のものが可能であるかは未知数ですが挑戦してみてください