我正在从数组中创建一些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
对其进行修改,该如何将来定位?
答案 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;
}