Вот пример того, как вы можете зарегистрировать обратный вызов, который будет вызываться при нажатии клавиши в виджете ввода. Вы можете использовать этот обратный вызов для автоматической вставки da sh при необходимости.
Здесь я использую метод 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', '-');
}
}
}