Arrays Perl/Tk小部件列表

Arrays Perl/Tk小部件列表,arrays,perl,tk,Arrays,Perl,Tk,我想创建用户验证,我有两个Tk::Entry小部件(一个用于用户名,一个用于密码)。它们的大多数属性都是相同的,所以我自然觉得有必要使用OOP。我尝试了几种方法,但没有一种有效 是否有某种方法可以像这样绑定samme列表中的两个小部件: my @uv_entry = (my $uv_ent1 = $uv_frm1->Entry, my $uv_ent2 = $uv_frm1->Entry); 并为它们使用相同的configure()和pack()变量

我想创建用户验证,我有两个Tk::Entry小部件(一个用于用户名,一个用于密码)。它们的大多数属性都是相同的,所以我自然觉得有必要使用OOP。我尝试了几种方法,但没有一种有效

是否有某种方法可以像这样绑定samme列表中的两个小部件:

my @uv_entry = (my $uv_ent1 = $uv_frm1->Entry,
                my $uv_ent2 = $uv_frm1->Entry);
并为它们使用相同的
configure()
pack()
变量

编辑: 在我的研究中,在perldoc Tk::options中,您可以阅读fallowing概要(建议对数组只使用一个选项?):

Tk窗口小部件在层次结构树中按顺序排列,从
MainWindow
开始向下(在本例中,如:
MainWindow
Frame
Entry
)。所以我想我需要把
框架
对象作为
$widget
值,所以我做了如下操作:

my @uv_entry = (my $uv_ent1, my $uv_ent2);

@uv_entry = $uv_frm1->Entry->configure(qw/-width 16 -bg black
                -foreground green
                -disabledbackground grey
                -insertbackground green
                -insertwidth 5/
                )->pack(-side => 'top', -pady => 3);
编译器告诉我的结果是什么:

Can't call method "pack" on an undefined value at ./test.pl line 37.
这让我很不高兴,但我只是尝试在没有pack子程序的情况下编译它。这很好,但我在屏幕上没有看到结果。(据我所知,Tk没有任何draw/render子例程,它只绘制初始化的小部件。)

现在,当我尝试做任何事情时,比如从
@uv\u条目
列表的一个元素打印一些值:

print $uv_entry[0]->cget('-bg') . "\n";
我得到:

Can't call method "cget" on an undefined value at ./test.pl line 43.

configure
子例程是否不关心变量的类型是否正确或定义是否正确?我做错了什么?

似乎
configure()
没有返回调用它的小部件。这就是为什么在调用
configure()
之后无法将调用链接到
pack()
。但是,在方法调用链中调用
configure()
之前,可以调用
pack()
(因为
pack()
返回调用它的小部件)

所以你可以这样做:

my @uv_entry = map { $uv_frm1->Entry() } 1..2;
$_->pack(-side => 'top', -pady => 3) 
  ->configure(
      qw/-width 16 -bg black
         -foreground green
         -disabledbackground grey
         -insertbackground green
         -insertwidth 5/
  ) for @uv_entry;

似乎
configure()
没有返回调用它的小部件。这就是为什么在调用
configure()
之后无法将调用链接到
pack()
。但是,在方法调用链中调用
configure()
之前,可以调用
pack()
(因为
pack()
返回调用它的小部件)

所以你可以这样做:

my @uv_entry = map { $uv_frm1->Entry() } 1..2;
$_->pack(-side => 'top', -pady => 3) 
  ->configure(
      qw/-width 16 -bg black
         -foreground green
         -disabledbackground grey
         -insertbackground green
         -insertwidth 5/
  ) for @uv_entry;
你能再加一点代码吗?你是怎么用的?我不熟悉TK,但我可以解释您显示的代码的作用。在
$uv\u ent1
中,返回值为
$uv\u frm1->Entry
,在
$uv\u ent2
中返回值为
$uv\u frm1->Entry
。我猜
Entry
每次调用都会返回一个新对象。然后,您的
@uv\u条目将由
$uv\u ent1
$uv\u ent2
组成。因此,这段代码是有效的,它为您提供了一个包含两个内容的数组。但是你不能用它们做任何事情。你能不能再添加一点代码?你是怎么用的?我不熟悉TK,但我可以解释您显示的代码的作用。在
$uv\u ent1
中,返回值为
$uv\u frm1->Entry
,在
$uv\u ent2
中返回值为
$uv\u frm1->Entry
。我猜
Entry
每次调用都会返回一个新对象。然后,您的
@uv\u条目将由
$uv\u ent1
$uv\u ent2
组成。因此,这段代码是有效的,它为您提供了一个包含两个内容的数组。但你什么都不用它们。