Introductionでも述べたように,GUIではユーザからのイベントが発生すると,それに伴ったアクションがコールバックされます.今まで,何気なしにいろいろなウィジェットを見てきましたが,良く見るとその一つ一つにイベント/アクションの関係が,(デフォルトで)定義されています.
例えば,「ボタンの上でマウスの左ボタンをおす」というイベントが発生すると,「ボタンがへこんで,-command以下がコールバックされる」というアクションが起こります.このイベント−アクションの対応づけのことをバインド(bind)といいます.
Perl/Tkではbindというメソッドが用意されており,これを使って自分で勝手にbindを定義できます.例えば,
といったことも出来ます.bindは高度なGUIを作るにはなくてはならないものです.がんばって覚えましょう.
bindはXのイベントに対して,特定の処理(アクション)を実行するためのメソッドです.
書式: $widget->bind(sequence, callback)
説明: sequence で指定されたイベントが$widgetで発生すると,コールバック関数callbackを実行します.
sequenceに使える主なイベント: sequenceでは<Key>のように<>でかこむ.
| イベント | 説明 |
| Button | マウスボタンが押された |
| ButtonRelease | マウスボタンが押された状態から離された |
| Key | キーボードのキーが押された |
| KeyRelease | キーボードのキーが押された状態から離された |
| Configure | ウィンドウのサイズや位置が変化した |
| Destroy | ウィンドウが削除された |
| Enter | マウスカーソルがウィンドウに入った |
| Leave | マウスカーソルがウィンドウから出た |
| Motion | ウィンドウ内でマウスに動きがあった |
ハイフン(-)とモディファイヤ
上で述べたイベントを,−で後置修飾することで,特定のキーやボタンのイベントを指定できます.
例:
また,シフトキーやCtrlキーなど複数のキーを使う場合はモディファイヤで前置修飾します.
例:
連続したい場合は,
のように,連続したシーケンスで与えることもできます.
補足:
ウィジェットによってはデフォルトのバインドとぶつかる場合があります.(Textにおける右クリックなど).このような場合は,ウィジェットのクラスを指定して,
$mw->bind('Tk::Text', '<Button-3>', \&Popup_menu);
とすると,Tk::Textクラスのバインドを上書きすることができます.
サンプル:
#!/usr/bin/perl -w
use Tk;
$mw = MainWindow->new;
$msg = "Ctrl-Qで終了します";
$ent= $mw->Entry(-background=>'white',
-width => 30)
->pack(-fill=>'x');
$ent->focus;
$mw->Label(-textvariable=>\$msg,
-anchor=>'w',
-relief=> 'sunken')
->pack(-fill=>'x');
$ent->bind( '<Key-Return>', sub {$msg=$ent->get; $ent->delete(0,'end');});
$mw->bind( '<Control-Key-q>', sub {exit;});
MainLoop;
# ---
# bind.pl