in reply to Re^2: TK Gui Help
in thread TK Gui Help

however, there remains the issue of capturing values from additional widgets added dynamically.

When in doubt, just start stuffing selections into a global hash, then the selections will always be available. You get your data out by looping thru the hash keys. Every new widget gets a new hash entry, so you can add to your heart's content, keeping everything in a hash.


I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku ................... flash japh

Replies are listed 'Best First'.
Re^4: TK Gui Help
by Anonymous Monk on Jun 27, 2014 at 13:44 UTC
    An example would be appreciated of growing a dynamic hash for every new widget. The hash will need to store the same data set, yet, is treated uniquely by the GUI even if the selected item(s) is/are the same value. I was thinking of something along these lines:
    my $count = 0; my %division{$_} = ( 1 => 'AF', 2 => 'CSS', ); my $addbutton = $f->Button(-text => "Add Chart Blocks", -command => [\&addwidget,$division{$count++}], )->pack(-anchor => +'s');
    This way the hash would come in as division1, division2, etc. The counter would increment every time the button is pressed and thus creating a unique hash name based on the event. Does this make some sense? Thanks for all the patience and help thus far.
      You sort of have the right idea, but there is one thing to watch out for: do not try to use the widget as a hashkey, as it will result in an error. You are doing it right by assigning a counter. Here is an example based on my code example above. P.S. To make your code look better, put your listboxes into Scrolled Panes. This example needs some work to make it look right, but it demonstrates the hash idea quite nicely.
      #!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Pane; my $mw = MainWindow->new; $mw->geometry(q/+100+100/); $mw->title("Test Script"); #need exportselection=>0 for using multiple selection boxes my %lbhash; # you want to use the listbox to hold your # data, so store the widget's actual object # with the name you want to give it my @choices = ('afg', 'dfg', 'erty', 'etc'); foreach my $choice(@choices){ my $pane = $mw->Scrolled('Pane')->pack(-side => 'left'); my $label = $pane->Label(-text=> $choice, -bg=>'lightseagreen') ->pack(-side=>'top'); $lbhash{ $choice }{'widget'} = $pane->Listbox(-bg => 'white', -selectmode => 'extended', -exportselection=> 0 )->pack(-side=>'bottom'); my @random_data; for(1..20){push @random_data ,int rand(100) } $lbhash{ $choice }{'widget'} ->insert( 'end', @random_data ); } $mw->Button( -text => "Selections", -command => sub{ foreach my $key( keys %lbhash ){ my @selects = $lbhash{ $key }{'widget'}->curselection; print "$key: "; foreach my $select (@selects){ print $lbhash{ $key }{'widget'}->get($select),' '; } print "\n\n"; } } )->pack( -side => 'left' ); $mw->Button( -text => "Done", -command => \&exit )->pack; MainLoop;

      I'm not really a human, but I play one on earth.
      Old Perl Programmer Haiku ................... flash japh
        My Gui is starting to come around, yet I still do not know how to add multiple units of the same widgets row-by-row and then to collect the data en-masse row-by-row. I have been able to pick up all the data from just one row. I am almost there. Here is the code:
        #!C:\Perl64\bin\perl.exe use strict; use warnings; use Tk; use Tk::Pane; my $mw = MainWindow->new; $mw->geometry(q/+100+100/); $mw->title("Test Script"); $mw->fontCreate('big', -weight=>'bold', -size=> 18 ); #need exportselection=>0 for using multiple selection boxes my %lbhash; # you want to use the listbox to hold your # data, so store the widget's actual object # with the name you want to give it my @choices = ('afg', 'dfg', 'erty'); my @divisional_unit =('Division Unit Left','Division Unit Middle','Div +ision Unit Right'); my $text=""; my $count = 0; my $num=$count++; my $count1 = 0; my $num1=$count1++; my $count2 = 0; my $num2=$count2++; my $count3 = 0; my $num3=$count3++; my @labels=("Left Text Header", "Middle Text Header", "Right Text Head +er"); my @labels1=("LC", "MC", "RC"); my @list = ("LC", "MC", "RC"); my %entry; my $inbox; my %checkbox; my $settings; foreach my $choice(@divisional_unit){ my $pane = $mw->Scrolled('Pane')->pack(-side => 'left'); #create a has for the entry widget $entry{$labels[$num++]} = $mw->Entry(-textvariable=>$text)->pack(-side +=>'left'); my $checkbox = $mw -> Checkbutton(-text=>$labels1[$num2++], -variable=>\$settings->{checkbuttons}->{$list[$num3++]},-offvalue= +>0,-onvalue=>1)->pack(-side=>'left'); my $label = $pane->Label(-text=> $choice, -bg=>'lightseagreen') ->pack(-side=>'top'); $lbhash{ $choice }{'widget'} = $pane->Listbox(-bg => 'white', -selectmode => 'extended', -exportselection=> 0 )->pack(-side=>'bottom'); #my @random_data; #for(1..20){push @random_data ,int rand(100) } $lbhash{ $choice }{'widget'} ->insert( 'end', @choices); #} } $mw->Button( -text => "Selections", -command => sub{ foreach my $key( sort keys %lbhash ){ my @selects = $lbhash{ $key }{'widget'}->curselection; print "$key: "; foreach my $select (@selects){ print $lbhash{ $key }{'widget'}->get($select),' '; } print "\n\n"; } foreach my $key1( sort keys %entry ){ my @selects2 = $entry{$key1}->get(); print "$key1:"; foreach my $s (@selects2) { print $s,"\n"; } } print join( "\n", grep { $settings->{checkbuttons}->{$_} +} @list ); } )->pack( -side => 'bottom' ); $mw->Button( -text => "Done", -command => \&exit )->pack(-side=>'botto +m'); MainLoop;
        Thanks for all the wonderful help zentara.