perl - 需要 PerlTk 中的文本框帮助
问题描述
我需要在 perlTk 中设置一个文本框,这样我就可以输入带有自动添加分隔符的 2 位数字。
例如。如果有 5 个两位数的条目,即 52、25、69、45、15,在文本框中如果我输入这五个 2 位数字,则分隔符 (-) 应在每两位输入后自动添加。
最后的条目看起来像 52 - 25 - 69 - 45 - 15 请不要自动插入分隔符。
这有点类似于下面的 gif。 在此处输入图像描述
解决方案
这是一个示例,说明如何注册在条目小部件中按下键时要调用的回调。您可以在需要时使用此回调自动插入破折号。
在这里,我使用在小部件bind()
上注册按键事件的方法Tk::Entry
,我还使用-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', '-');
}
}
}
推荐阅读
- c - 在linux中使用strchr查找绝对路径
- shopify-app - 根据商品编号打印不同商品的折扣值
- swift - Swift SceneKit 也不是圆形球体
- java - 创建事件后线程“AWT-EventQueue-0”java.lang.NoClassDefFoundError 中的异常
- bash - 如何使用终端从csv文件中提取列
- c - getaddrinfo 过期值(Linux 主机名条目)
- database - Cassandra 如何在其 SSTables 中高效地对可变长度行进行二进制搜索?
- java - 如何在类路径中添加多个 JAR 文件(通过终端)
- prometheus - 带有多个表达式的警报
- python - Python - 上传文件的名称和缩略图问题