访问从循环创建的Tk帧

时间:2018-07-09 09:50:15

标签: perl foreach tk

我正在从数组中创建一些Tk帧。每个框架都有一个标签和一个状态。状态由background选项和$color参数表示。

我已经举了下面的例子

#!/usr/bin/perl

use strict;
use warnings;

use Tk;

my $mw         = MainWindow->new(-title => 'test');
my $main_frame = $mw->Frame()->pack(-side => 'top', -fill => 'x');

my @array = ('M024','M016','M032','M066','M065','M044','M096','M099');

foreach my $example ( @array ) {
  Frame_creation($example, 'green');
};

MainLoop;

sub Frame_creation{
    my ($name, $color) = @_;

    my $exempleFrame = $main_frame->Frame()->pack(-side => 'left', -fill => 'x');
    my $exempleLabel = $exempleFrame->Label(-text => $name, -background => $color)->pack(-side => 'left', -fill => 'x');
}

创建框架后,如果我想使用configure对其进行修改,该如何将来定位?

1 个答案:

答案 0 :(得分:2)

句柄$exempleFrame允许您通过configure访问框架以对其进行修改。您只需要将其复制到某个位置,以使子例程退出时不会丢失

在您的情况下,您可以让子例程返回框架句柄

sub frame_creation{
    my ($name, $color) = @_;

    my $exempleFrame = $main_frame->Frame()->pack(-side => 'left', -fill => 'x');
    my $exempleLabel = $exempleFrame->Label(-text => $name, -background => $color)->pack(-side => 'left', -fill => 'x');

    return $exempleFrame;
}

,当您拨打电话时,它可能pushed到一个阵列上

my @frames;

for my $name ( @names ) {
    push @frames, frame_creation($name, 'green');
}

您可以像这样拨打电话

$frames[4]->configure(-background => 'red')

设置单个框架的属性

最好根据访问帧的方式进行不同的处理(例如,将帧名与其句柄相关联的哈希可能有用),但是此方法将为您提供帧句柄的简单集合,这可能足够

注意

编写代码时,每个标签会完全填充并遮盖其框架父级,因此设置框架的背景色将没有可见效果

这是一个完整的程序,可以保留红色标签的背景,但是在标签周围添加(外部)十个像素填充,以便可以看到其包含的框

#!/usr/bin/perl

use strict;
use warnings;

use Tk;

my $mw = MainWindow->new(-title => 'test');

my @names = qw/ M024 M016 M032 M066 M065 M044 M096 M099 /;
my @frames;

my $main_frame = $mw->Frame()->pack(-side => 'top', -fill => 'x');

push @frames, frame_creation($_, 'green') for @names;

$_->configure(-bg => 'red') for @frames;

MainLoop();

sub frame_creation{
    my ($name, $color) = @_;

    my $frame = $main_frame->Frame()->pack(
        -side => 'left',
        -fill => 'x',
    );

    my $label = $frame->Label(
        -text => $name,
        -bg   => $color,
    )->pack(
        -side => 'left',
        -fill => 'x',
        -padx => 10,
        -pady => 10,
    );

    $frame;
}

输出

Perl/Tk Example