Perl tk - раздел между уиджетите за въвеждане

Имам много прост GUI, който взаимодейства с базата данни postgresql. Мейнфреймът е разделен на 4 квадранта, като всеки квадрант има 4 джаджи за влизане. Ето примерен код на един квадрант

my $f_blue = $bottom_half->Frame(-bg=>'BLUE')-> pack(-side=>'left', -expand=>1, -fill=>'both');
$f_blue->Label(-text=>'BLUE', -bg=>'blue', -fg=>'white')->pack(-side=>'top');

my $blue_table = $f_blue->Table(-rows => 3,
                   -columns => 3,
                   -fixedrows => 1,
                   -fixedcolumns => 1,
                   -scrollbars => 'oo',
                   -relief => 'raised') -> pack(-side => 'top', -expand => 1, -fill=>'both');

$blue_table -> put(1,1,
          $blue_table->Label(-text => 'Cs-137:'));

my $t_blue_cs137 = $blue_table->Entry(-selectbackground=>"blueviolet");
$blue_table -> put(1,2,$t_blue_cs137);

$blue_table -> put(1,3,
          $blue_table->Label(-text => 'MBq'));



$blue_table -> put(2,1,
          $blue_table->Label(-text => 'Tc-99m:'));
my $t_blue_tc99m = $blue_table->Entry(-selectbackground=>"blueviolet");
$blue_table -> put(2,2,$t_blue_tc99m);
$blue_table -> put(2,3,
          $blue_table->Label(-text => 'MBq:'));

$blue_table -> put(3,1,
          $blue_table->Label(-text => 'Tl-201:'));
my $t_blue_tl201 = $blue_table->Entry(-selectbackground=>"blueviolet");
$blue_table -> put(3,2,$t_blue_tl201);
$blue_table -> put(3,3,
          $blue_table->Label(-text => 'MBq:'));

Когато въвеждам данни с помощта на графичния потребителски интерфейс, не мога да премина към следващия запис. Има ли начин за задаване на обвързвания на клавиши, така че да мога да настроя циклично

`$t_blue_cs137` to be active
 PRESS TAB
`$t_blue_tc99m` NOW ACTIVE
PRESS TAB
`$t_blue_tl201` NOW ACTIVE
PRESS TAB
Do the same with the next quadrant
`$t_red_cs137`  in frame $f_red NOW ACTIVE

Има ли начин да направите това в perlTK

Пробвал съм следното

$f_blue->bindtags( [ ($f_blue->bindtags)[$t_blue_cs137,$t_blue_tc99m,$t_blue_tl201] ] );
# fix the bindtags order so that widget events are
# processed before class events
$f_blue->bind("<Tab>", sub { $f_blue->focusNext; Tk->break; });

Това обаче ми позволява само разделяне между всеки подкадър и бутоните в GUI


person moadeep    schedule 14.11.2013    source източник


Отговори (1)


Дефинирайте

-takefocus => 0,

в конфигурация Table.

По подразбиране -takefocus е зададено на истинска стойност, което кара метода FocusChildren да връща празен списък, а това от своя страна означава, че фокусът никога не се дава на дъщерните уиджети на таблицата. Не е най-доброто по подразбиране, но това поведение беше въведено в Tk 402.001 и вероятно вече е твърде късно за промяна. Но може би трябва да има параграф в документацията, описващ този капан...

person Slaven Rezic    schedule 14.11.2013