in reply to perl/Tk Entry validation

Would you have any advice to make it work?

Yes, show a complete example which demonstrates the problem. It look off the top of my head, that you may have a problem in the return value from -validatecommand .... it should return a 1 or 0. Look how this works.

#!/usr/bin/perl use strict; use warnings; use Tk; my $top = MainWindow->new(); $top->geometry('200x200'); my %entries; for(1..4){ $entries{$_}{'value'} ||= 0; $entries{$_}{'entry'} = $top->Entry( -textvariable => \$entries{$_}{'value'}, -width => 5, -bg => 'white', -validate => 'key', -vcmd => \&validate, )->pack; } MainLoop; #have to make sure empty value has numeric context sub validate{ my $val = shift; $val ||= 0; #get alphas and punctuation out if( $val !~ /^\d+$/ ){ return 0 } if (($val >= 0) and ($val <= 100)) {return 1} else{ return 0 } }

I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku ................... flash japh

Replies are listed 'Best First'.
Re^2: perl/Tk Entry validation
by contact@solamen.fr (Novice) on Jul 24, 2012 at 12:43 UTC
    Sorry for this lack of courtesy. Posting the complete example is indeed a good practice. I'll stick to it. Based on your example I tried the following code to add the boundaries as arguments of the validate subroutine. I cannot figure out how to reference the input value in the -validatecommand. I have tried $_, $_[0] and $xVConsSflEmbMax but none seems to work...
    use strict; use Tk; my $xVConsSflEmbMax0 = 1.0; my $xVConsSflEmbMax = $xVConsSflEmbMax0; my $mw = new MainWindow(); my $entry = $mw->Entry( -textvariable => \$xVConsSflEmbMax, -width => 3, -validate => 'focusout', -validatecommand => [\&validSub,$_[0],0,1], -invalidcommand => sub {$xVConsSflEmbMax=$xVConsSflEmbMax0}, ) -> pack; MainLoop; sub validSub { my ($val,$min,$max) = @_; $val ||= 0; $min ||= -1E10; $max ||= 1E10; if( $val !~ /^\d*\.?\d+$/ ) { return 0 } elsif (($val >= $min) and ($val <= $max)) {return 1} else { return 0 } }
      As you might have noticed in the documentation or in the example above, you do not have to send any arguments to validatecommand. They are sent automatically.
        Actually the question is not really if it is NECESSARY to pass some arguments to the validate command but if it is POSSIBLE - just as it is done in the case of any other command using a subroutine reference with arguments in a list. Remember I want to set the boundaries as parameters of the validation process.