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

Esteemed monks,

I seem to be having more trouble with Perl/Tk than a monkey with a whole case of bananas!

In this code I have a Toplevel with two BrowseEntry's on it. One is populated from a globally declared array, the other from a database search.

But when I select a value in the upper box, it appears in the lower one as well, likewise, If I select a value in the lower box it appers in the upper one.

Where on earth am I going wrong?

sub doListPull { my %ds; my $rec; my ($id, $datasource, $ds_desc); debug("+doListPullDialog"); if ( ! Exists($tlp)) { $tlp = $mainwindow->Toplevel(); $tlp->title("List Pulling Configuration"); my $tlp_pt = $tlp->BrowseEntry(-label => 'Pull list type', -variable => $state->{pullType})->grid(-padx => 5, -pa +dy => 5); $tlp_pt->focus; $tlp_pt->insert('end', @pullTypes); my $tlp_ds = $tlp->BrowseEntry(-label => "DataSource", -variable => $state->{pullDs})->grid(-padx => 5, -pady + => 5); my $SQL = "SELECT id, sourcename, sourcedesc from datasource;" +; my $sth = $dbh->prepare( $SQL ); $sth->execute; while (($id, $datasource, $ds_desc) = $sth->fetchrow_array) { $tlp_ds->insert('end', ($datasource." ".$ds_desc)); $rec->{$datasource} = ${ds_desc}; $dsources[$id] = $rec; } } debug("-doListPullDialog"); }
$state is a globally declared hash to store the current values of the various parts of the script.

Frustrated monk!

...john

Replies are listed 'Best First'.
Re: Perl/Tk - values appearing in the wrong place!
by bbfu (Curate) on Aug 06, 2003 at 23:00 UTC

    What do $state->{pullType} and $state->{pullDs} contain? Are you using strict?

    Most likely, the two hash entries contain the same thing (probably an inital desired state string), and you're not using strict. The -variable option expects a reference, and you're passing it (presumably) a simple scalar. If you're not using strict, this will get treated as a symbolic reference. If it's a valid symbolic reference (and an empty string is a valid reference), you're basically giving the two BrowseEntry's the same state variable, so changes in one are going to be reflected in the other automatically.

    To illustrate, try this example code:

    #!/usr/bin/winperl use Tk; use Tk::BrowseEntry; $state = { one => '', two => '', three => '', four => '', }; $mw = MainWindow->new(); $mw->BrowseEntry( -label => 'List One', -choices => [qw(foo bar)], -variable => $state->{one}, )->grid(-padx => 5, -pady => 5); $mw->BrowseEntry( -label => 'List Two', -choices => [qw(baz quux)], -variable => $state->{two}, )->grid(-padx => 5, -pady => 5); # versus $mw->BrowseEntry( -label => 'List Three', -choices => [qw(foo bar)], -variable => \$state->{three}, )->grid(-padx => 5, -pady => 5, -column => 2, -row => 0); $mw->BrowseEntry( -label => 'List Four', -choices => [qw(baz quux)], -variable => \$state->{four}, )->grid(-padx => 5, -pady => 5, -column => 2, -row => 1); MainLoop;

    bbfu
    Black flowers blossom
    Fearless on my breath

      I ++'d you because I think you've got the answer.

      Interestingly enough, though, use strict does not save you from this one. I added use strict, put a my in front of the initializations of $state and $mw, and the code acts the same.

      --Bob Niederman, http://bob-n.com

        Huh, you're right. Odd. I guess Tk's not respecting strict 'refs' like it should. I'd say that's probably a bug somewhere in the (compiled) bindings. *shrug*

        Anyway, did you add the \ to enreference the hash element, as demonstrated in the second two BrowseEntry examples? That should solve the problem, at least.

        bbfu
        Black flowers blossom
        Fearless on my breath