2014-12-30 6 views
1

루프를 통해 Tkx가있는 Perl에서 버튼의 시퀀스를 정의하려고합니다. 각 버튼의 텍스트와 액션은 해시 테이블의 배열로 정의됩니다.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'}}(); 
} 

답변

0

사실, 참조를 통해 해당 명령을 호출해야하며 인수는 참조되지 않습니다.

$Widg{".fButton.bRun$id"}=$Widg{".fButton"}->new_ttk__button(-text => $rh_measure->{'descr'}, -command => [\&wrapper, $id]);