Нужна помощь текстового поля в PerlTk - PullRequest
0 голосов
/ 01 мая 2020

Мне нужна настройка текстового поля в perlTk, чтобы я мог ввести число 2 di git с автоматически добавленным разделителем.

Например. если в текстовом поле есть 5 записей из двух цифр, а именно 52, 25, 69, 45, 15, если я введу эти пять цифр из двух цифр, то разделитель (-) должен автоматически добавляться после каждых двух записей di git.

и окончательная запись будет выглядеть как 52 - 25 - 69 - 45 - 15 Пожалуйста, не вставляйте разделитель автоматически.

Это похоже на рисунок ниже. введите описание изображения здесь

1 Ответ

1 голос
/ 01 мая 2020

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