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

Hi,

I m using Tk:JBrowseEntry module to create a windows based combo box. I need to know the selected value of that combo box. Actually i tried with following code (it is under Tk module) to get the selected value, but it fails

map {$combo1->get($_)} $combo1->curselection;

Kindly help me

Regards,
Sujana

  • Comment on how to get selected value of jbrowseEntrycombo box

Replies are listed 'Best First'.
Re: how to get selected value of jbrowseEntrycombo box
by zentara (Cardinal) on May 04, 2009 at 16:14 UTC
    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
      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
Re: how to get selected value of jbrowseEntrycombo box
by kennethk (Abbot) on May 04, 2009 at 15:49 UTC
    I think you might benefit from reading How (Not) To Ask A Question. While I can say that the syntax in your code snippet seems reasonable, it's impossible to replicate your behavior with the very small sample you've provided. As well, you say "it fails", but it is unclear what that means in this context. Does the code fail to compile? Does it just not reproduce the behavior you expect? What behavior do you expect?

    Please post additional code (wrapped in <code> tags - Writeup Formatting Tips). If possible, make as short as you can, but a monk who wants to help should be able to just download it, run it and see the behavior you are having trouble with.