ルモーリン

リストボックスのイベントを拾う

投稿:2018-12-18

行をダブルクリックして設定を変えるような動作を作りたい。 ところがリストボックスをダブルクリックしてもプログラムは分からず、当然のことながらどこをダブルクリックしたかも分からない。 こいつを何とかしたい。
こちらのサイトを参考にしました。→ Tcl/Tk お気楽 GUI プログラミング入門編
参考にした書き方がこちら。
bind .lb <Double-1> {
	~
}
それと
.lb curselection
で選択した行が返るようです。
コマンド名+ウィジェット名+パラメタの場合は「"ウィジェットの変数"->g_"コマンド名"(パラメタ)」で呼べます。 呼び出すサブルーチンdouble_clickの第1引数にウィジェットを渡して操作できるようにします。
$lbx->g_bind(
	"<Double-1>" => [\&double_click, $lbx, ],
);
ウィジェット名+コマンド名の場合は「"ウィジェットの変数"->"コマンド名"」で呼べます。
$lbx->curselection;
手軽にスクロールバーを付けられるのでリストボックスはこれを使っています。
Tkx::Scrolled - Tkx megawidget for scrolled widgets - metacpan.org
ところがイベントを拾う際にこのリストボックスを指定するとイベントが伝わりません。
生成されるウィジェットがリストボックスそのものではないらしく、そこにダブルクリックをバインドしてもイベントを受けられません。 子の中に「scrolled」というウィジェットがあり、これがリストボックス自体のようで、ここにバインドします。
$lbx->_kid("scrolled")->g_bind(
	"<Double-1>" => [\&double_click, $lbx, ],
);
動作するコードは次のようになります。
#!/usr/bin/perl -w

use utf8;
use strict;
use warnings;
use open IO => ":utf8";

use v5.10;
use Encode::Locale;
use Tkx;
use Tkx::Scrolled;

binmode STDOUT, ":encoding(console_out)";
binmode STDIN, ":encoding(console_in)";

$| = 1;

$Tkx::TRACE = 1;

my $mw = Tkx::widget->new(".");

my $lbx = $mw->new_tkx_Scrolled(
	"listbox",
	-selectmode => "single",
	-scrollbars => "e",
	-width => 20,
	-height => 10,
	-activestyle => "none",
);
$lbx->g_pack(-anchor => "w");

$lbx->_kid("scrolled")->g_bind(
	"<Double-1>" => [\&double_click, $lbx, ],
);

$lbx->insert("end", "item $_") for (0 .. 19);

Tkx::MainLoop();

exit;

sub double_click {
	my ($lbx) = @_;
	my ($idx) = $lbx->curselection;
	say "click $idx";
}
Perl/Tkxのトレースがエラー出力に出すよう「$Tkx::TRACE = 1;」を実行しています。 起動後にリストボックスの5行目をダブルクリックした場合のトレース結果がこちらになります。 おそらくTcl/Tkのコマンドだと思います。 Perl/Tkxと見比べて参考にしてください。
Tkx-1-0.0s-sample_tkx_7.pl-22: winfo children .
Tkx-2-0.0s-sample_tkx_7.pl-22: package require tile
Tkx-3-0.0s-sample_tkx_7.pl-22: ttk::frame .t -class Tkx_Scrolled
Tkx-4-0.0s-sample_tkx_7.pl-22: listbox .t.scrolled -width 20 -height 10 -selectmode single -activestyle none
Tkx-5-0.0s-sample_tkx_7.pl-22: ttk::scrollbar .t.xscrollbar -orient horizontal
Tkx-6-0.0s-sample_tkx_7.pl-22: ttk::scrollbar .t.yscrollbar -orient vertical
Tkx-7-0.0s-sample_tkx_7.pl-22: .t.xscrollbar configure -command [list .t.scrolled xview]
Tkx-8-0.0s-sample_tkx_7.pl-22: .t.yscrollbar configure -command [list .t.scrolled yview]
Tkx-9-0.0s-sample_tkx_7.pl-22: .t.scrolled configure -xscrollcommand perl::callback
Tkx-10-0.0s-sample_tkx_7.pl-22: .t.scrolled configure -yscrollcommand perl::callback
Tkx-11-0.0s-sample_tkx_7.pl-22: grid .t.scrolled -row 1 -column 1 -sticky nsew
Tkx-12-0.0s-sample_tkx_7.pl-22: grid .t.yscrollbar -row 1 -column 2 -sticky ns
Tkx-13-0.0s-sample_tkx_7.pl-22: grid columnconfigure .t 1 -weight 1
Tkx-14-0.0s-sample_tkx_7.pl-22: grid rowconfigure .t 1 -weight 1
Tkx-15-0.0s-sample_tkx_7.pl-30: pack .t -anchor w
Tkx-16-0.0s-sample_tkx_7.pl-32: bind .t.scrolled <Double-1> perl::callback
Tkx-17-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 0}
Tkx-18-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 1}
Tkx-19-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 2}
Tkx-20-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 3}
Tkx-21-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 4}
Tkx-22-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 5}
Tkx-23-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 6}
Tkx-24-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 7}
Tkx-25-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 8}
Tkx-26-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 9}
Tkx-27-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 10}
Tkx-28-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 11}
Tkx-29-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 12}
Tkx-30-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 13}
Tkx-31-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 14}
Tkx-32-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 15}
Tkx-33-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 16}
Tkx-34-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 17}
Tkx-35-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 18}
Tkx-36-0.0s-sample_tkx_7.pl-36: .t.scrolled insert end {item 19}
Tkx-37-0.1s-Tcl.pm-518: .t.yscrollbar set 0.0 0.5
Tkx-38-0.1s-Tcl.pm-518: .t.xscrollbar set 0.0 1.0
Tkx-39-10.7s-sample_tkx_7.pl-44: .t.scrolled curselection
click 5