Perl / Tk小部件列表

时间:2017-11-30 00:03:28

标签: arrays perl tk

我想创建用户验证,其中我有两个Tk :: Entery小部件(一个用于用户名,一个用于密码)。这些属性的大多数都是相同的,所以我觉得需要使用某种OOP。我一直在尝试几种方式而不是它们有效。

有没有办法在samme列表中绑定两个小部件,如下所示:

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没有任何绘制/渲染子程序,只要它们被初始化就会绘制小部件。)

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

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

我明白了:

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

configure子例程是否关心变量是正确的类型还是根本没有定义?我做错了什么?

1 个答案:

答案 0 :(得分:2)

似乎configure()没有返回调用它的小部件。这就是为什么在调用pack()后无法将呼叫链接到configure()的原因。但是,您可以在之前调用pack() ,在方法调用链中调用configure()(因为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;