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

Hi everyone. I am creating a basic GUI using Perl Tk and i have a feature i want to implement that i was hoping i could get some assistance with. Basically i have two entry widgets and a single button. Initially i want the button to be in the "disabled" state and to remain in this state under all conditions until both entry widgets have text in them. OnIt is at this point, i would like the button to then be changed into the "normal" state.

Assuming i am working on the main window. I have the following code

my $firstentry = $mw->Entry()->pack(); my $secondentry = $mw->Entry()->pack(); $but = $mw -> Button(-text => "OK", -state=>'disabled')->pack();

I guess at this point, i am after some ideas as to how i could trigger an event only when both entry widgets have text in them. This event would change the state of the button. The Entry widget does not have a -command feature. So that is out of the picture. I dont have much experience with the validate feature. Would this be able to help? Thanks. colpwd

Replies are listed 'Best First'.
Re: Perl Tk - Change button state based on event
by stefbv (Priest) on Jun 10, 2011 at 06:33 UTC

    Another way, using 'validate':

    use strict; use warnings; use Tk; my $mw = MainWindow->new; my $firstentry = $mw->Entry( -validate => 'focusout', -vcmd => [ \&check_state ], )->pack(); my $secondentry = $mw->Entry( -validate => 'focusout', -vcmd => [ \&check_state ], )->pack(); my $but = $mw->Button( -text => "OK", -state => 'disabled' )->pack(); MainLoop; sub check_state { if ( $firstentry->get and $secondentry->get ) { $but->configure( -state => 'normal' ); } else { $but->configure( -state => 'disabled' ); } }

      Oh! This is great. Thanks a lot for this. I was not too sure how to use validate, but based on the documentation, i had an inkling that it was capable of doing this task. Thanks again!

Re: Perl Tk - Change button state based on event
by Anonymous Monk on Jun 10, 2011 at 04:44 UTC
    I guess at this point, i am after some ideas as to how i could trigger an event only when both entry widgets have text in them. This event would change the state of the button.

    Here is a way, polling

    #!/usr/bin/perl -- use strict; use warnings; use Tk; my $mw = tkinit; my $bu = $mw -> Button(-text => "OK", -state=>'disabled')->pack(); my @te ; push @te, $mw->Entry()->pack; push @te, $mw->Entry()->pack; $mw->repeat( 900, sub { my $state = $bu->cget('-state') ; my $both = @te == grep { $_->index('end') } @te; if( $state ne 'normal' and $both ){ $bu->configure( -state => 'normal' ); } elsif( not $both ){ $bu->configure( -state => 'disabled' ); } }, ); MainLoop;
    About every second, it checks to see if both Entry widgets have a text length greater than zero, and disables/enables the button