Arrays Perl/Tk小部件列表
我想创建用户验证,我有两个Tk::Entry小部件(一个用于用户名,一个用于密码)。它们的大多数属性都是相同的,所以我自然觉得有必要使用OOP。我尝试了几种方法,但没有一种有效 是否有某种方法可以像这样绑定samme列表中的两个小部件: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()变量
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
组成。因此,这段代码是有效的,它为您提供了一个包含两个内容的数组。但你什么都不用它们。