[cologne-pm] 2. versuch: inhalt radiobutton dynamisch anpassen

CemS mutombo_ at gmx.net
Fr Mär 6 02:59:11 PST 2009


Hallo Susan,

Danke fuer Dein Antwort.  Hier die Loesung:
Man muss  Button Load mit destroy zestoeren und
immer wieder neu aufbauen. Sicherlich kann man es eleganter
machen aber so funktioniert es.


Gruss
Cem



#!/usr/bin/perl -w
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 $sw4;
my $sw1;
my $menub2;

my $Program   = 'undef';
my $CrashMode = 'undef';
my $Drive     = 'undef';
my $Side      = 'undef';
my $dummy     = 'undef';
my $Load      = 'undef';
my $Error     ='no';


my $mw = MainWindow->new;

#my $toplevel = $mw->toplevel;

my $MFrame1 = $mw->Frame()->pack(-side=>'top');
my $MFrame2 = $mw->Frame()->pack(-side=>'bottom');

my $Frame1 = $MFrame1->Frame()->pack(-side=>'left');
my $Frame2 = $MFrame1->Frame()->pack(-side=>'left');
my $Frame3 = $MFrame1->Button(-text => 'Exit',
                         -borderwidth=>'0',
                         -command => sub{exit})->pack(-side=>'right');
my $Frame4 = $MFrame2->Frame()->pack(-side=>'bottom',
                                -fill => 'both',
                                -expand=> '1');

my $menubar = $Frame1->Menu(-type => 'menubar',
                            -relief=>'groove',
                            -borderwidth=>'0')->pack;

my $w1 = $menubar->cascade(-label => 'Program',-tearoff => 0);
my $w2 = $menubar->cascade(-label => 'Crash Mode',-tearoff => 0);

$sw1 = $Frame2->Frame()->pack();

my $menub = $sw1 ->Menubutton(-text   =>  "Load",
                               -relief=>'groove',
                               -borderwidth=>'0')->pack();




foreach my $i (@VehicleProgram) {
    $w1->radiobutton (-label => "$i",
                      -command => \&set_bg,
                      -variable => \$Program,
                      -value => "$i")
}
foreach my $i (@CrashMode) {
    $w2->radiobutton (-label => "$i",
                      -command => \&set_bg,
                      -variable => \$CrashMode,
                      -value => "$i")
}


MainLoop;

sub set_bg {
    $sw1->destroy if Exists($sw1);
    $sw4->destroy if Exists($sw4);
    $sw4 = $Frame4->Frame(-relief => 'ridge', -bd => 2,-height=>'40')->pack();
    $sw4->Label(-text   =>  "$Program",)
                      ->pack(-side => 'left',-anchor => 'w');
    $sw4->Label(-text   =>  "$CrashMode",
                     )->pack(-side => 'left',-anchor => 'w');
    $sw4->Label(-text   =>  "$Drive",)
                      ->pack(-side => 'left',-anchor => 'w');
    $sw4->Label(-text   =>  "$Side",)
                      ->pack(-side => 'left',-anchor => 'w');
    $sw4->Label(-text   =>  "$dummy",)
                      ->pack(-side => 'left',-anchor => 'w');
    $sw4->Label(-text   =>  "$Load",)
                      ->pack(-side => 'left',-anchor => 'w');
    @LoadArrayRef=@Load;
UpdateLoadArray ();

  $sw1 = $Frame2->Frame()->pack();

my $menub = $sw1->Menubutton(-text   =>  "Load")->pack();

        foreach my $i (@LoadArrayRef) {
          $menub->radiobutton(
                       -label => "$i",
                       -command => \&set_bg,
                       -variable => \$Load,
                       -value => "$i"
                      );
    }
}

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 {
}






On 3/6/09, CemS <mutombo_ at gmx.net> wrote:
> Hallo,
>
>  leider hat keiner auf meine Frage reagiert daher
>  versuche ich es mal mit einem reduzierten code:
>
>  Was ich moechte:
>  1. Programm Starten (siehe code am Ende)
>  2. Program-> "AA selektieren"
>  3. Crash Mode -> "12 selektieren"
>  4. Jetzt soll Radiobutton Load nur die Elemente AA_121 und AA_122 beinhalten.
>
>
>  Problem:
>  Der Button (Inhalt von Load) wird beim programstart generiert und
>  nicht laufend angepasst.
>
>  Habe die Frage schon in perlmonks gestellt aber auch keine Loesung bekommen.
>  Wenn ich hier falsch sein sollte, wo kann ich meine Frage stellen?
>  Oder kann mir einer Stichwoerter geben, wonach ich bei google suchen kann?
>
>
>  Gruss und Danke
>  Cem Sakaryali
>
>
>  Code:
>
>
>  #!/usr/bin/perl -w
>  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 $sw4;
>
>  my $Program   = 'undef';
>  my $CrashMode = 'undef';
>  my $Drive     = 'undef';
>  my $Side      = 'undef';
>  my $dummy     = 'undef';
>  my $Load      = 'undef';
>  my $Error     ='no';
>
>
>  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);
>
>  $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');
>
>
>
>  foreach my $i (@VehicleProgram) {
>     $w1->radiobutton (-label => "$i",
>                       -command => \&set_bg,
>                       -variable => \$Program,
>                       -value => "$i")
>  }
>  foreach my $i (@CrashMode) {
>     $w2->radiobutton (-label => "$i",
>                       -command => \&set_bg,
>                       -variable => \$CrashMode,
>                       -value => "$i")
>  }
>  foreach my $i (@LoadArrayRef) {
>     $w6->radiobutton (-label => "$i",
>                       -command => \&set_bg,
>                       -variable => \$Load,
>                       -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",)
>                       ->pack(-side => 'left',-anchor => 'w');
>     $sw4->Label(-text   =>  "$CrashMode",
>                      )->pack(-side => 'left',-anchor => 'w');
>     $sw4->Label(-text   =>  "$Drive",)
>                       ->pack(-side => 'left',-anchor => 'w');
>     $sw4->Label(-text   =>  "$Side",)
>                       ->pack(-side => 'left',-anchor => 'w');
>     $sw4->Label(-text   =>  "$dummy",)
>                       ->pack(-side => 'left',-anchor => 'w');
>     $sw4->Label(-text   =>  "$Load",)
>                       ->pack(-side => 'left',-anchor => 'w');
>     @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 {
>  }
>


Mehr Informationen über die Mailingliste cologne-pm