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

It's me back again fellow monks!

I got a long way with multiple widows being opened from menues etc. after your advice yesterday.

I have a window with a BrowseEntry object at the top, then a series of LabEntry objects. I can select the entry I want in the BrowseEntry and use DBI to get it form the database, but how do I fill in teh values in teh LabEntry's?

Gotta be something simple that this simple initiate is missing!

Pardon the code, it is at a very early stage! I am just trying to get a grip of this Tk stuff.

sub doTLUser { if (! Exists($tlu)) { $tlu = $mainwindow->Toplevel(); $tlu->title("User Management"); $lb = $tlu->BrowseEntry(-label => 'Username', -variable => \$search_string,)->pack; $lb->bind("<Return>", \&do_search); $lb->focus; $SQL = "SELECT username FROM user;"; $sth = &Do_SQL; while ($username = $sth->fetchrow_array) { push @listnames, $username; } $sth->finish; $lb->insert('end', @listnames); $tlu->LabEntry(-label => "First Name", -labelPack => [-side => "left", -anchor => "w"], -width => 20, -textvariable => \$user->{firstname})->pack(-side => "top" +, -anchor => "ne"); $tlu->LabEntry(-label => "Last Name", -labelPack => [-side => "left", -anchor => "w"], -width => 20, -textvariable => \$user->{lastname})->pack(-side => "top", -anchor => "ne"); $tlu->LabEntry(-label => "Password", -labelPack => [-side => "left", -anchor => "w"], -width => 20, -textvariable => \$user->{password})->pack(-side => "top", -anchor => "ne"); $tlu->Button(-text => "Close", -command => sub {$tlu->withdraw})->pack(-side => "bottom") +; } else { $tlu->deiconify(); $tlu->raise(); } } # # do_search # Take the variable returned by the BrowseEntry and search for it in t +he database. # sub do_search { print "String returned: $search_string\n"; $SQL = "SELECT username, firstname, lastname, password FROM user +WHERE username =\'$search_string\'"; $sth = &Do_SQL; while ($user = $sth->fetchrow_hashref) { print "$user->{firstname}\n"; return; } print "User not found so enter data\n"; return; }

Replies are listed 'Best First'.
Re: Updating values in Tk Toplevel object
by bobn (Chaplain) on Jul 17, 2003 at 22:06 UTC

    UPDATE: If code you posted doesn't work to do the update, I think I see why. When you create the LabEntry, you are setting -textvariable => \$user->{firstname}. Then when you retrieve from the database, you are saying: $user = $sth->fetchrow_hashref - which overwrites the the hashref $user you used in the LabEntry - if use use print "$user\n" before and after the the fetchrow_hashref, they should be different. This is the problem, to fix it, preserve $user by fetching to a different hashref, then say $user->{firstname} = $other->{firstname}.

    This stuff is so cool. Having bound a variable to the -textvariable, you just change that variable and it automagically works:

    #!/usr/bin/perl -w use Tk; my %User = ( firstname=>'bob' ); my $user = \%User; my $mw = MainWindow->new(); my $lbe = $mw->LabEntry(-label => "First Name", -labelPack => [-side => "left", -anchor => "w"], -width => 20, -textvariable => \$user->{firstname})->pack(-side => "top", -anchor => "ne"); my $btn = $mw->Button(-command=> sub { $user->{firstname} = ''. localt +ime})->pack; MainLoop;

    Run it, click the button, be suitably impressed ;-P

    --Bob Niederman, http://bob-n.com
      That works fine!

      As soon as I got back and read your comments it became pretty darned obvious. I made the change in the DBI fetch subroutine and it all works just as I wanted it to. I suppose you could say that the variable is bound, but it isn't always the same variable!

      Many thanks!

      John