部品の操作

この章では SAD/Tkinterに備え付けられている各種の部品にある程度共通する操作の概要を紹介します。 現在までに組み込まれている部品は次の表のとおりです。

部品機能コマンド結合変数
Window各種部品を収容するウインドウ
Frame各種部品を収容する枠
Button単純なボタンCommandTextVariable
CheckButtonON/OFFのチェックマーク付ボタンCommandVariable, TextVariable
RadioButton他者択一型のボタンCommandVariable, TextVariable
TextLabel複数行のテキスト・ラベルTextVariable
TextMessageフォーマット可能なテキストTextVariable
Entry文字列の入力枠TextVariable
ListBox複数行の文字列からなる選択箱
ScrollBarスクロール・バー
Menuプルダウン・メニューPostCommand
MenuButtonMenuを割り付けるためのボタン
Scaleスライド・スケールCommandVariable
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キーの解放
ConfigureWindow の 位置、大きさなどの属性の変更
DestroyWindow が 消去された
ExposeWindow が 露出した
FocusInWindow に焦点があった
FocusOutWindow から焦点が外れた

イヴェントの型

Key, KeyRelease などにはキーの種類が詳細として付加されます。例えば、 "<Key-a>", "<a>", "a" などはどれもキー a の押し下げを表わしています。

またReturn, Escape, Up, Down, Left, Right 等々のKeySymも使うことができます。

イヴェントにはいくつかの修飾子をつけることができます それらはキーボードの修飾キーに対応したものや、ダブル・クリックなどを表わすためのものです。

修飾子動作
Controlコントロール・キー
Shiftシフト・キー
Lockシフト・ロック・キー
Meta, Mメタキー
AltAlt キー
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"梱包の際の部品の起点
ExpandTrue, 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ピクセルまたは単位付文字列境界(立体表示される)の幅
BDBorderWidth 略称
Cursor形状文字列マウス・カーソルの形状
Heightピクセルまたは単位付文字列部品の高さ
HighlightColor色名称または RGBColor[r,g,b]焦点が合った時の背景色
Relief"flat", "groove", "raised","ridge", "sunken枠の立体形状
Widthピクセル、文字数、または単位付文字列部品の幅

各部品に共通な属性

表で「単位付文字列」とは、例えば 1 cm を"1c"、1 inch を "1i"などと表わすものです。 各属性の単位やデフォルト値は部品の種類によって異なります。以後、各部品の中で標準と異なるばあいにはそのつど示します。

部品の枠の立体形状

属性 Relief で指定する、部品の枠の各種の立体形状を図に示します。

Relief.jpg

部品の枠の立体形状。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 -> "カーソル名 文字色 背景色"

のように指定することができます。ここでカーソル名称としては図にある備え付けの物のほかに、"@ファイル名" と書けばファイルからもロードできます。

Cursorbuiltin.jpg

備え付けのマウスカーソル

部品の情報の獲得

作成された各々の部品については 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}

のような具合です。

FromGeometry

WidgetGeometry

ToGeometry

部品の消去

プログラムの終了、切り替えなどですでに製作した部品を必要としなくなった場合には、必ず

 DeleteWidget[部品シンボル1, 部品シンボル2, ... ];

のように、関数 DeleteWidget により、不要な部品を消去してください。また、

 部品シンボル1 =.

は DeleteWidget[部品シンボル1] と同様の働きをします。

ある部品に結合した結合変数は、その変数を最初に結合した部品を消去した時に自動的に消去されます。また、結合変数は

 DeleteVariable[変数1, 変数2, ... ];

のように、DeleteVariable} を使って消去することもできます。

SAD/Tkinter の制御

前にも述べましたが、SAD/Tkinter の部品はただ定義しただけでは表示も何もされません。表示、更新、イヴェントへの反応などは通常、関数 TkWait[], TkSense[]、あるいは Update[] が呼ばれたときにだけ起こります。

TkWait[], TkReturn

Update[]

WaitExpression[]

After[]

Bell[]


トップ   差分 バックアップ リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-05-17 (土) 14:44:01