Цикл для определения кнопок в Perl / Tkx
Я пытаюсь определить последовательность кнопок в Perl с Tkx через цикл; текст и действия каждой кнопки определяются в массиве хеш-таблиц.
Однако независимо от того, на какую кнопку я нажимаю, срабатывает только действие последней кнопки.
Это код, который я использую.
use strict;
use Tkx;
my @Buttons = (
{ 'descr'=> "Button #0", 'cmd'=> sub { print "TODO: to implement (button #0)\n\n"; } },
{ 'descr'=> "Button #1", 'cmd'=> sub { print "TODO: to implement (button #1)\n\n"; } }
);
my %Widg;
$Widg{"."}= Tkx::widget->new(".");
$Widg{"."}->g_wm_title("List of buttons");
$Widg{"."}->g_wm_minsize(350, 300);
Tkx::font_create("H4", -family => "Helvetica", -size => 8);
$Widg{".fButton"} = $Widg{"."}->new_ttk__frame( -padding => "2 2 5 5");
$Widg{".fButton"}->g_grid(-row => 1, -sticky => "w");
my $id=-1;
foreach my $rh_measure (@Buttons) {
++$id;
$Widg{".fButton.bRun$id"}=$Widg{".fButton"}->new_ttk__button(-text => $rh_measure->{'descr'}, -command => sub { &wrapper($id); });
$Widg{".fButton.bRun$id"}->g_grid( -row => $id, -column => 1, -sticky => "w");
}
Tkx::MainLoop;
sub wrapper {
my $id=shift;
print "Process command for button #$id\n";
&{$Buttons[$id]->{'cmd'}}();
}
1 ответ
Решение
На самом деле, вам просто нужно вызвать команду через ссылку, а на аргумент не ссылаться.
$Widg{".fButton.bRun$id"}=$Widg{".fButton"}->new_ttk__button(-text => $rh_measure->{'descr'}, -command => [\&wrapper, $id]);