bindとeventについて


Introductionでも述べたように,GUIではユーザからのイベントが発生すると,それに伴ったアクションがコールバックされます.今まで,何気なしにいろいろなウィジェットを見てきましたが,良く見るとその一つ一つにイベント/アクションの関係が,(デフォルトで)定義されています.

例えば,「ボタンの上でマウスの左ボタンをおす」というイベントが発生すると,「ボタンがへこんで,-command以下がコールバックされる」というアクションが起こります.このイベント−アクションの対応づけのことをバインド(bind)といいます.

Perl/Tkではbindというメソッドが用意されており,これを使って自分で勝手にbindを定義できます.例えば,

といったことも出来ます.bindは高度なGUIを作るにはなくてはならないものです.がんばって覚えましょう.

■ bindメソッド

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