sfinster has asked for the wisdom of the Perl Monks concerning the following question:

I have a TK interface that has several Entry fields on it. Each of these entries has a validation callback on loss of focus.

The problem is, after I dismiss the messagebox used to display the error, I am unable to type anything in. I have to click elsewhere to make the entry lose focus again, get the error message again, and then I'm able to use the keyboard again.

Clearly this isn't acceptable. Can anyone give me a hint as to what's going on and how to fix it? Thanks.

I'm using Perl 5.6.1 on Solaris 2.6.

Here are some code snippets:

$angleEntry = $myForm->Entry(-width => 12, -validate => 'focusout' -validatecommand => \&angleCallback, -invalidcommand => \&angleError, -textvariable => \$angle)->pack; sub angleCallback { my ($str, $newchar, $curstr, $index, $type) = @_; if ((length($str) == 0 || !($str =~ /^\d*.?\d*/) || (str > 360)) { $angleEntry->focus; $angleEntry->selection('range', 0, 'end'); return 0; } return 1; } sub AngleError { $mainWin->messageBox(-title => 'Error', -message => 'Angle must be a number between 0.0 and 360.0', -type => 'OK'); }

Replies are listed 'Best First'.
Re: Problem with keyboard after entry validation
by CombatSquirrel (Hermit) on Oct 09, 2003 at 15:04 UTC
    After fixing the code a bit (I would assume that to have been typos), the following code works just fine for me:
    use Tk; $myForm = new MainWindow; $angleEntry = $myForm->Entry( -width => 12, -validate => 'focusout', -validatecommand => \&angleCallback, -invalidcommand => \&AngleError, -textvariable => \$angle )->pack; $other = $myForm->Entry(-width => 12)->pack; sub angleCallback { my ($str, $newchar, $curstr, $index, $type) = @_; if (length($str) == 0 or $str !~ /^\d*.?\d*$/ or $str > 360) { $angleEntry->focus; $angleEntry->selection('range', 0, 'end'); return 0; } return 1; } sub AngleError { $myForm->messageBox( -title => 'Error', -message => 'Angle must be a number between 0.0 and 360.0', -type => 'OK' ); } MainLoop;
    Could you maybe provide a small script that reproduces your error?
    CombatSquirrel.
    Entropy is the tendency of everything going to hell.
      I have narrowed the problem down slightly. It only seems to happen (today, anyway) if I use Enter to leave the message box. Clicking the Ok button works fine.

      A large part of my frustration is that this works fine on some machines, not on others. The larger program is so huge it would take me a while to pare it down, but I may have to resort to that.

      (sorry 'bout those typos!)