Perl/Tk 个小部件列表

Perl/Tk widgets lists

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

有没有办法像这样绑定同一个列表中的两个小部件:

my @uv_entry = (my $uv_ent1 = $uv_frm1->Entry,
                my $uv_ent2 = $uv_frm1->Entry);

并为它们使用相同的 configure()pack() 变体?

编辑:

好吧,对于我的研究,在 perldoc Tk::options 中,您可以阅读以下概要( 建议一个人只能对数组使用一个选项?):

$widget->configure(-option=>value ?,-option=>value ...?);
@list = $widget->configure('-option');
@lol = $widget->configure;

Tk 小部件在层次结构树中是有序的,从 MainWindow 开始向下(例如:MainWindow > Frame > Entry 在这种情况下)。所以我想我需要把 Frame 对象作为 $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_entry 列表的一个元素中打印一些值:

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

我得到:

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

configure 子程序根本不关心变量是正确的类型还是已定义?我做错了什么?

似乎 configure() 没有 return 调用它的小部件。这就是为什么您不能在调用 configure() 之后链接对 pack() 的调用。但是您可以在方法调用链中调用 pack() 之前 调用 configure() (因为 pack() return 是小部件调用于)。

所以你可以这样做:

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;