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

Hello from Cologne Germany, I want to get updated the content of the radiobutton during the execution of the code.
my @VehicleProgram=('AA','BB'); #if user selects $VehicleProgram=AA my @CrashMode=('12','13'); #if user selects $CrashMode=12 my @Load=('AA_121','AA_13','BB_12','CC_12','AA_122'); depending on $VehicleProgram and $CrashMode the radiobuton Load should contains only the relevant Values of @Load #Radiobutton Load (@LoadArrayRef) # should contain ONLY 'AA_121' and 'AA_122'
Below is the code which I am using. It seams, the button will be created during the initialization and does not get updated. It works when I create a new toplevel window for Load and destroy it after selection but I prefer to have all the buttons on same window.
Thank you in advance for your help. Cem
#!/usr/bin/perl -w use Tk; my @VehicleProgram=('AA','BB'); my @CrashMode=('12','13'); my @Drive=('lhd','rhd'); my @Side=('Driver','Passanger'); my @Dummy =('50','95','5'); my @Load=('AA_121','AA_13','BB_12','CC_12','AA_122'); @LoadArrayRef=@Load; $Program = 'undef'; $CrashMode = 'undef'; $Drive = 'undef'; $Side = 'undef'; $dummy = 'undef'; $Load = 'undef'; $Error ='no'; $font2='-adobe-courier-medium-r-normal--16-100-100-100-m-90-iso8859-2' +; my $mw = MainWindow->new; my $toplevel = $mw->toplevel; my $menubar = $toplevel->Menu(-type => 'menubar')->pack; my $w1 = $menubar->cascade(-label => 'Program',-tearoff => 0); my $w2 = $menubar->cascade(-label => 'Crash Mode',-tearoff => 0); my $w3 = $menubar->cascade(-label => 'Drive',-tearoff => 0); my $w4 = $menubar->cascade(-label => 'Side',-tearoff => 0); my $w5 = $menubar->cascade(-label => 'Dummy',-tearoff => 0); my $w6 = $menubar->cascade(-label => 'Load',-tearoff => 0); my $w11 =$menubar->Button(-label => 'CreateRun', -command => \&CreateRun,-state => 'disabled'); $menubar->Button(-label => 'Exit', -command => sub{exit}); my $sw3 = $mw->Frame(-relief => 'ridge', -bd => 2,-height=>'40')->pack(-side => 'top', -anchor => 'w', -expand => 0, -fill => 'both'); my $cm1=$sw3->Label(-text => " Comment: ", -font => "$font2")->pack(-side => 'left',-anchor => 'w'); my $cm2=$sw3->Entry(-textvariable => \$comment, -background => "white",-foreground => "black",-relief => 'ridge', -font => "$font2")->pack(-side => 'left',-anchor => 'w'); foreach my $i (@VehicleProgram) {$w1->radiobutton (-label => "$i", -command => \&set_bg,-variable => \$Program,-font => "$font2", -value => "$i")} foreach my $i (@CrashMode) {$w2->radiobutton (-label => "$i", -command => \&set_bg,-variable => \$CrashMode, -font => "$font2",-value => "$i")} foreach my $i (@Drive) {$w3->radiobutton (-label => "$i", -command => \&set_bg,-variable => \$Drive, -font => "$font2",-value => "$i")} foreach my $i (@Side) {$w4->radiobutton (-label => "$i", -command => \&set_bg,-variable => \$Side, -font => "$font2",-value => "$i")} foreach my $i (@Dummy) {$w5->radiobutton (-label => "$i", -command => \&set_bg,-variable => \$dummy, -font => "$font2",-value => "$i")} foreach my $i (@LoadArrayRef) {$w6->radiobutton (-label => "$i", -command => \&set_bg,-variable => \$Load, -font => "$font2",-value => "$i")} MainLoop; sub set_bg { $sw4->destroy if Exists($sw4); $sw4 = $mw->Frame(-relief => 'ridge', -bd => 2, -height=>'40')->pack(-side => 'top', -anchor => 'w', -expand => 0, -fill => 'both'); $sw4->Label(-text => "$Program", -font => "$font2")->pack(-side => 'left',-anchor => 'w'); $sw4->Label(-text => "$CrashMode", -font => "$font2")->pack(-side => 'left',-anchor => 'w'); $sw4->Label(-text => "$Drive", -font => "$font2")->pack(-side => 'left',-anchor => 'w'); $sw4->Label(-text => "$Side", -font => "$font2")->pack(-side => 'left',-anchor => 'w'); $sw4->Label(-text => "$dummy", -font => "$font2")->pack(-side => 'left',-anchor => 'w'); $sw4->Label(-text => "$Load", -font => "$font2")->pack(-side => 'left',-anchor => 'w'); $w11->configure(-state => 'active') if ($Program ne 'undef' and $CrashMode ne 'undef' and $Drive ne 'undef' and $Side ne 'undef' and $dummy ne 'undef' and $Load ne 'undef'); @LoadArrayRef=@Load; UpdateLoadArray (); } sub UpdateLoadArray { my (@new); foreach (@LoadArrayRef) { if ($_ !~ /$Program/) {next} if ($_ !~ /$CrashMode/) {next} print "$_\n"; push (@new,$_); } @LoadArrayRef=@new; print "-----\n"; print "Program:$Program CrashMode:$CrashMode\n"; foreach (@LoadArrayRef) {print "$_\n"} print "-----\n"; } sub CreateRun { }

Replies are listed 'Best First'.
Re: PerlTK: update radiobutton content on code execution
by zentara (Cardinal) on Feb 27, 2009 at 13:16 UTC
    First, use strict. Also I can't tell what you want to do. I've added some debugging statements, that show whats happening, and I added textvariable to $Load so it updates automatically. Beyond that I don't know what you are doing.

    I'm not really a human, but I play one on earth My Petition to the Great Cosmic Conciousness
      Hi zentara, thank you for your help. I will try to explain my problem. start script. Program-> chose AA CrashMode-> chose 12 > Now the Button Load should display only AA_121 and AA_122. Currently all Elements of the Array @Load are displayed. Thanks Cem
      Cleaned code
      #!/usr/bin/perl use warnings; use strict; use Tk; my @VehicleProgram = ( 'AA', 'BB' ); my @CrashMode = ( '12', '13' ); my @Load = ( 'AA_121', 'AA_13', 'BB_12', 'CC_12', 'AA_122' ) +; my @LoadArrayRef = @Load; my $Program = 'undef'; my $CrashMode = 'undef'; my $Load = 'undef'; my $Error = 'no'; my $font2 = '-adobe-courier-medium-r-normal--16-100-100-100-m-90-iso88 +59-2'; my $sw4; my $comment; my $mw = MainWindow->new; my $toplevel = $mw->toplevel; my $menubar = $toplevel->Menu( -type => 'menubar' )->pack; my $w1 = $menubar->cascade( -label => 'Program', -tearoff => 0 ); my $w2 = $menubar->cascade( -label => 'Crash Mode', -tearoff => 0 ); my $w6 = $menubar->cascade( -label => 'Load', -tearoff => 0 ); my $sw3 = $mw->Frame( -relief => 'ridge', -bd => 2, -height => '40' )->pack( -side => 'top', -anchor => 'w', -expand => 0, -fill => 'both' ); foreach my $i ( @VehicleProgram ) { $w1->radiobutton( -label => "$i", -command => \&set_bg, -variable => \$Program, -font => "$font2", -value => "$i" ); } foreach my $i ( @CrashMode ) { $w2->radiobutton( -label => "$i", -command => \&set_bg, -variable => \$CrashMode, -font => "$font2", -value => "$i" ); } foreach my $i ( @LoadArrayRef ) { $w6->radiobutton( -label => "$i", -command => \&set_bg, -variable => \$Load, -font => "$font2", -value => "$i" ); } MainLoop; sub set_bg { $sw4->destroy if Exists( $sw4 ); $sw4 = $mw->Frame( -relief => 'ridge', -bd => 2, -height => '40' )->pack( -side => 'top', -anchor => 'w', -expand => 0, -fill => 'both' ); $sw4->Label( -text => "$Program", -font => "$font2" )->pack( -side => 'left', -anchor => 'w' ); $sw4->Label( -text => "$CrashMode", -font => "$font2" )->pack( -side => 'left', -anchor => 'w' ); $sw4->Label( -textvariable => \$Load, -font => "$font2" )->pack( -side => 'left', -anchor => 'w' ); @LoadArrayRef = @Load; UpdateLoadArray(); } sub UpdateLoadArray { my ( @new ); print "@LoadArrayRef\n\n"; foreach ( @LoadArrayRef ) { if ( $_ !~ /$Program/ ) { next } if ( $_ !~ /$CrashMode/ ) { next } print "$_\n"; push( @new, $_ ); } @LoadArrayRef = @new; print "-----\n"; print "new-> @new\n"; print "Program:$Program CrashMode:$CrashMode\n"; # update label thru textvariable $Load = join ' ', @new; foreach ( @LoadArrayRef ) { print "$_\n" } print "-----\n"; } sub CreateRun { }
        Well you have a problem with your putting undef in quotes, like = 'undef'. You could switch to total textvariables in the label, and set them to '' instead of undef. That way, they will display as "no width' in the label, unless they have a value.

        I'm not really a human, but I play one on earth My Petition to the Great Cosmic Conciousness