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;
我想创建用户验证,我有两个 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;