在 PerlTk 中需要文本框帮助
Need a text box help in PerlTk
我需要在 perlTk 中设置一个文本框,以便我可以输入带有自动添加分隔符的 2 位数字。
例如。如果有 5 个两位数条目,即 52、25、69、45、15,在文本框中,如果我输入这五个 2 位数字,分隔符 (-) 应自动添加在每两个数字输入后。
最后的条目看起来像
52 - 25 - 69 - 45 - 15
请注意分隔符应该自动插入。
这有点类似于下面的gif。
enter image description here
这里是一个示例,说明如何注册在输入小部件中按下某个键时要调用的回调。您可以使用此回调在需要时自动插入破折号。
我在这里使用 bind()
method to register keypress events on a Tk::Entry
widget, I also use -validatecommand
来确保用户输入的字符不会超过 14 个:
use feature qw(say);
use strict;
use warnings;
use Tk;
{
my $mw = MainWindow->new();
my $label = $mw->Label(
-text => "Enter serial number",
-justify => 'left'
)->pack( -side => 'top', -anchor => 'w', -padx => 1, -pady =>1);
my $entry = $mw->Entry(
-width => 14,
-state => "normal",
-validate => "key",
-validatecommand => sub { length( $_[0] ) <= 14 ? 1 : 0 }
)->pack(
-side => 'bottom',
-anchor => 'w',
-fill => 'x',
-expand => 1,
);
$entry->bind( '<KeyPress>', sub { validate_entry( $entry ) } );
MainLoop;
}
sub validate_entry {
my ( $entry ) = @_;
my $cur = $entry->get();
my @fields = split "-", $cur;
my $last_field = pop @fields;
for my $field ( @fields ) {
if ( (length $field) != 2 ) {
say "Bad input";
return;
}
}
my $num_fields = scalar @fields;
if ( $num_fields < 4 ) {
if (length $last_field == 2 ) {
$entry->insert('end', '-');
}
}
}
我需要在 perlTk 中设置一个文本框,以便我可以输入带有自动添加分隔符的 2 位数字。
例如。如果有 5 个两位数条目,即 52、25、69、45、15,在文本框中,如果我输入这五个 2 位数字,分隔符 (-) 应自动添加在每两个数字输入后。
最后的条目看起来像 52 - 25 - 69 - 45 - 15 请注意分隔符应该自动插入。
这有点类似于下面的gif。 enter image description here
这里是一个示例,说明如何注册在输入小部件中按下某个键时要调用的回调。您可以使用此回调在需要时自动插入破折号。
我在这里使用 bind()
method to register keypress events on a Tk::Entry
widget, I also use -validatecommand
来确保用户输入的字符不会超过 14 个:
use feature qw(say);
use strict;
use warnings;
use Tk;
{
my $mw = MainWindow->new();
my $label = $mw->Label(
-text => "Enter serial number",
-justify => 'left'
)->pack( -side => 'top', -anchor => 'w', -padx => 1, -pady =>1);
my $entry = $mw->Entry(
-width => 14,
-state => "normal",
-validate => "key",
-validatecommand => sub { length( $_[0] ) <= 14 ? 1 : 0 }
)->pack(
-side => 'bottom',
-anchor => 'w',
-fill => 'x',
-expand => 1,
);
$entry->bind( '<KeyPress>', sub { validate_entry( $entry ) } );
MainLoop;
}
sub validate_entry {
my ( $entry ) = @_;
my $cur = $entry->get();
my @fields = split "-", $cur;
my $last_field = pop @fields;
for my $field ( @fields ) {
if ( (length $field) != 2 ) {
say "Bad input";
return;
}
}
my $num_fields = scalar @fields;
if ( $num_fields < 4 ) {
if (length $last_field == 2 ) {
$entry->insert('end', '-');
}
}
}