我想创建用户验证,其中我有两个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
子例程是否关心变量是正确的类型还是根本没有定义?我做错了什么?
答案 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;