Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: Dynamically add Optionmenus based on variable perl tk

by TomDLux (Vicar)
on Jul 28, 2011 at 14:57 UTC ( [id://917282]=note: print w/replies, xml ) Need Help??


in reply to Dynamically add Optionmenus based on variable perl tk

Nothing to do with your question ...

Looking at the code I see a frightening swarm of indecipherable characters. I would suggest extracting the special codes into predefined variables. That way you have something meaningful, and it becomes easier to verify they contain what you want them to contain.

Readonly my %CHINESE_WORDS => ( perl => 'Ти+п АКБ:', monk => 'Ти+п АКБ:' ); Readonly my %PROTEINS => ( A => 'Ти+п АКБ:', C => 'Ти+п АКБ:', G => 'Ти+п АКБ:', T => 'Ти+п АКБ:', );

Obviously I reused the same string over and over, but I think you can see how defining constants would make the strings easier to verify, and the main code shorter and clearer.

As Occam said: Entia non sunt multiplicanda praeter necessitatem.

Replies are listed 'Best First'.
Re^2: Dynamically add Optionmenus based on variable perl tk
by pashanoid (Scribe) on Jul 28, 2011 at 18:20 UTC

    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

      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
Domain Nodelet?
Node Status?
node history
Node Type: note [id://917282]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (4)
As of 2024-04-19 16:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found