in reply to how to get selected value of jbrowseEntrycombo box

You are lucky I happened by..... here is an oldie by grandfather. Searching google and groups.google is your best bet for Tk questions, as most have been answered before. Then ask here, if no previous answer was found.
#!/usr/bin/perl use strict; use warnings; use Tk; use Tk::DialogBox; use Tk::JComboBox; # example by grandfather of perlmonks.org # shows how to make the textvariable ref update # see other example my $main = MainWindow->new (-title => "Test JComboBox"); EditPlayers ($main); sub EditPlayers { my ($main, $sel) = @_; my @ids = qw(Fred Joe Bob); my $dlg = $main->DialogBox (-title => "Member Information", -butto +ns => ["OK", "Cancel"]); my $id = $sel || (@ids && $ids[0]) || ''; my $IDText = $dlg->add ( 'JComboBox', -mode => 'readonly', -selectcommand => [\&changeEditPlayer, \$id], -validate => 'match', -textvariable => \$id, ); $IDText->form (-left => '%0', -right => '%100', -top => '%0'); $IDText->configure (-options => \@ids); #$IDText->setSelected ($id); # dosn't work $IDText->setSelected ($sel || (@ids && $ids[0]) || ''); #works return if $dlg->Show (-global) ne 'OK'; } sub changeEditPlayer { my ($id, $widget, $index, $value, $name) = @_; return 1 if ! defined $name; print "$name\n"; }

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

Replies are listed 'Best First'.
Re^2: how to get selected value of jbrowseEntrycombo box
by Sandy (Curate) on May 05, 2009 at 19:06 UTC
    An interesting note:

    If we insert some 'print' statements, we can see that the $dlg->add() function resets the value of $id, I am assuming because it does not match any of the 'valid' options.

    #... code my $id = $sel || (@ids && $ids[0]) || ''; print "id 1 is <$id>\n"; my $IDText = $dlg->add ( 'JComboBox', -mode => 'readonly', -selectcommand => [\&changeEditPlayer, \$id], -validate => 'match', -textvariable => \$id, ); print "id 2 is <$id>\n";
    What is also interesting, is that we cannot set $id to anything now that is associated with the readonly JComboBox. However, once the options are defined, $id can be set, but only to a valid option.
    $id = "Joe";print "id is not Joe!! <$id>\n"; $IDText->form (-left => '%0', -right => '%100', -top => '%0'); $IDText->configure (-options => \@ids); # not only sets the selection but calls <c>changeEditPlayer</c> $id = "Joe"; print "now id is not empty!! <$id>\n"; # does nothing, because 'Sandy' is not a valid option $id = "Sandy"; print "id not set to Sandy because it is an invalid + option <$id>\n"; $id = $sel || (@ids && $ids[0]) || ''; ### now it works !! $IDText->setSelected ($id); # dosn't work
    With the print statement modified slightly in changeEditPlayer, we get the following results (without any clicking of the mouse!)
    id 1 is <Fred> id 2 is <> id is not Joe!! <> - inside changeEditPlayer Joe now id is not empty!! <Joe> id not set to Sandy because it is an invalid option <Joe> - inside changeEditPlayer Fred
    Honestly, I was a bit confused when I was first playing with this bit of code. Never had I seen a straight declaration, like the following, not work.
    $id = 'Sandy'; print "<$id>\n"; # prints Joe
      FWIW, if you really look into how the -validate callback works for most widgets that have it, the results are confusing.....in other words....it's tricky to get validate to do what you want. Check out Simple Tk Gauge for an interesting trick.

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