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

Dear All, I have written code to create 5 Entry widgets by using for loop, Now i want to capture values of each entry widget and print those values but now i am getting last entry box value only,remaining values are not getting.Kindly help me..

#! c:\perl\Bin use Tk; use Tk::LabFrame; $mw = MainWindow->new; for($i=0;$i<=5;$i++) { $j=$mw->Entry(-validate=>all,-validatecommand=>\&f)->pack(); } sub f { $i1=$j->get(); print $i1; } MainLoop;

Replies are listed 'Best First'.
Re: Entry widget values are not getting
by aitap (Curate) on Aug 10, 2012 at 10:32 UTC

    Firstly, store your $j in an array, then get them from it. For example,

    my @j; for (0..4) { push @j,$mw->Entry()->pack(); } sub f { print $_->get for @_; } &f(@j);

    Secondly, you're doing it all wrong because -validatecommand should work with own parameters, not with some global variables. See http://search.cpan.org/~srezic/Tk-804.030/pod/Entry.pod#VALIDATION:

    The validateCommand and invalidCommand are called with the following arguments:
    · The proposed value of the entry. If you are configuring the entry
    widget to have a new textvariable, this will be the value of that textvariable.
    · The characters to be added (or deleted). This will be "undef" if validation is due to focus, explcit call to validate or if change is due to "-textvariable" changing.
    · The current value of entry i.e. before the proposed change.
    · index of char string to be added/deleted, if any. -1 otherwise
    · type of action. 1 == INSERT, 0 == DELETE, -1 if it's a forced validation or textvariable validation
    Just print $_[0] inside your -validatecommand.

    Sorry if my advice was wrong.
Re: Entry widget values are not getting
by zentara (Cardinal) on Aug 10, 2012 at 10:59 UTC
    The docs for validation are not very clear in Tk::Entry, but the -validatecommand callback is designed to accept a return of 1, 0, or -1 from the callback.

    You may squeeze some other functionality out of it, but I wouldn't count on it working the way you expect. Here is how I might do it.

    #!/usr/bin/perl use warnings; use strict; use Tk; my $mw = MainWindow->new; my %ents; for( my $i=0;$i<=5;$i++) { $ents{$i} = $mw->Entry( -bg => 'white', )->pack(); $ents{$i}->bind('<Return>', \&display ); } MainLoop; sub display { foreach my $ent (sort keys %ents ){ print $ents{$ent}->get(),"\n"; } print "\n\n"; }

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