Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^2: Dynamically add Optionmenus based on variable perl tk

by pashanoid (Scribe)
on Jul 28, 2011 at 18:20 UTC ( #917313=note: print w/replies, xml ) Need Help??


in reply to Re: Dynamically add Optionmenus based on variable perl tk
in thread Dynamically add Optionmenus based on variable perl tk

Sorry about that one... I have a Radiobutton with 4 options. If a user selects option 2, everything is fine, a subroutine writes some value to where it supposed to write it and all is well. However, If she selects option 1, well, that subroutine should do the same thing AND another Option menu should appear with more choices because that particular radiobutton needs more info associated with it... Now, I'm not writting the code for the Optionmenu, presuming the subroutine &extra_acc_vals will generate it. And it does, but I have to select button 1, then close out this window with the Radiobuttons. Then hit a button that opens it again, and THEN these extra Optionmenus appear. I really appreciate your help on this one!!!

my $acc_type_frame = $tab2->Frame()->pack(-side=>'top', -anchor=>'nw', + -padx=>'15'); #tab 2 $acc_type_frame->Label(-font => 'tab_rus_bold', -text => 'some + text 1') ->pack(-side=>'left'); $acc_type_frame->Radiobutton(-font => 'tab_rus', -text => 'Val +ue 0 if checked &extra_acc_vals should generate Optionmenus below', - +value => '0', -variable => \$acc_type, -command => sub {&write_map(' +384','0') #these commands should be executed firs/as well}) ->pack(-s +ide=>'left'); $acc_type_frame->Radiobutton(-font => 'tab_rus', -text => 'Val +ue 1 if checked no extra Optionmenus should appear', -value => '1', - +variable => \$acc_type, -command => sub {&write_map('384','1')})->pac +k(-side=>'left'); $acc_type_frame->Radiobutton(-font => 'tab_rus', -text => 'Val +ue 1 if checked no extra Optionmenus should appear', -value => '2', - +variable => \$acc_type, -command => sub {&write_map('384','2')}) ->pack(-side=>'left'); $acc_type_frame->Radiobutton(-font => 'tab_rus', -text => 'Val +ue 0 if checked &extra_acc_vals should generate Optionmenus below', - +value => '3', -variable => \$acc_type, -command => sub {&write_map('3 +84','3')}) ->pack(-side=>'left'); &extra_acc_vals($tab2, $acc_type_frame) if (($acc_type==0 ) || + ($acc_type==3)); #so if $acc_type is iether 0 or 3 the &extra_acc_va +ls should generate OptionMenus and such

Replies are listed 'Best First'.
Re^3: Dynamically add Optionmenus based on variable perl tk
by pashanoid (Scribe) on Jul 29, 2011 at 08:15 UTC

    I've written up this example:

    #!/usr/bin/perl use strict; use warnings; use Tk; my $mw = MainWindow->new; $mw->geometry("300x300"); my $var =1; my ($major, $other); my @options = ('one', 'two', 'three', 'four', 'five'); my $topics1=$mw->Radiobutton(-text =>'Selection 1', -value => '0', -variable => \$major, -command => sub {&do_smth('1')})->pack( +); my $topics2=$mw->Radiobutton(-text =>'Selection 2', -value => '1', -variable => \$major, -command => sub {&do_smth('2')})->pack() +; my $topics3=$mw->Radiobutton(-text =>'Selection 3', -value => '3', -variable => \$major, -command => sub {&do_smth('3')})->pack() +; if ($var eq 'more'){ my $options=$mw->Optionmenu( -options => [@options], -variable + => \$other, -command => [sub {&do_more($major, $other);}])->pack() +; } MainLoop; sub do_smth{ my $selection = shift; $var='more' unless ($selection == 2); } sub do_more{ my ($major, $other) = @_; print "do this: $other while Selection was $major\n"; }

    How do I make the extra Optionmenu to appear when choice 2 is called?

      In the latest release of Tk you can use $options->options() to reset the list whenever you like. Here is my version of your test case
      #!/usr/bin/perl use strict; use warnings; use Tk; my $mw = MainWindow->new; $mw->geometry("300x300"); my $var =1; my ($major, $other); my @options = ('one', 'two', 'three', 'four', 'five'); my $topics1=$mw->Radiobutton(-text =>'Selection 1', -value => '0', -variable => \$major, -command => sub {&do_smth('1')})->pack( +); my $topics2=$mw->Radiobutton(-text =>'Selection 2', -value => '1', -variable => \$major, -command => sub {&do_smth('2')})->pack() +; my $topics3=$mw->Radiobutton(-text =>'Selection 3', -value => '3', -variable => \$major, -command => sub {&do_smth('3')})->pack() +; my $options=$mw->Optionmenu( -options => [@options], -variable => \$ot +her, -command => [sub {&do_more($major, $other);}])->pack() +; MainLoop; sub do_smth{ my $selection = shift; if ($selection == 2) { $options->options ([@options, 'six' , 'seven']) } else { $options->options ([@options] ) } $var='more' unless ($selection == 2); } sub do_more{ my ($major, $other) = @_; print "do this: $other while Selection was $major\n"; }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://917313]
help
Chatterbox?
[Eily]: shmem Indeed :)
[choroba]: How is Bembel different from Krug?
[hippo]: karlgoethebier, Ich habe kein Deutsch.
[Corion]: choroba: A Bembel is a traditional pottery ware, which is only(!) used for serving Cider (well, Apfelwein)
[shmem]: choroba: it's hessisch
[Corion]: Not every Krug is a Bembel!
[karlgoethebier]: there is just the mug: 🍺
[Corion]: A Bembel must look like this
[karlgoethebier]: https://de. wikipedia.org/ wiki/Bembel#/ media/File: Bembel_Zum_blauen_ Bock_1978.jpg
[choroba]: as my friend says, Ich stehe Deutsche ver nicht aber klein ;-)

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (15)
As of 2017-05-24 08:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?