Есть две проблемы:
Если вы используете форму [coderef, arg, arg...]
для указания обратного вызова Tk, coderef всегда будет вызываться с виджетом, который вызвал событие, переданное в качестве первого аргумента. Так что это ваше $_[0]
. Два аргумента, которые вы хотите передать, будут заканчиваться на $_[1]
и $_[2]
.
Ваши переменные $boxA
и $boxB
уже являются ссылками, но вы передаете их с помощью дополнительного оператора \
. Это означает, что вам придется разыменовывать их в своей подпрограмме обратного вызова, прежде чем пытаться вызывать на них методы Tk. - Или опустите \
в определении обратного вызова:
use Tk;
use strict;
use warnings;
my $mw = MainWindow -> new();
my @arr = qw(1 2 3 4 5);
my $button = $mw -> Button (-text=>"Push me", -command => \&buttonCall) -> pack;
sub callee{
my $boxARef = $_[1];
my $boxBRef = $_[2];
my $index = $boxARef -> curselection();
$boxBRef -> selectionSet($index);
}
sub buttonCall{
my $boxA = $mw -> Listbox(-exportselection=>0, -selectmode => 'browse') -> pack;
$boxA -> insert('end', @arr);
my $boxB = $mw -> Listbox(-exportselection=>0, -selectmode => 'multiple') -> pack;
$boxB -> insert('end', @arr);
$boxA -> bind ('<<ListboxSelect>>' => [\&callee,$boxA,$boxB] );
}
MainLoop;