in reply to Re^3: Tk ::TableMatrix
in thread Tk ::TableMatrix

Hey, I was trying to make the table interactive so the user enters the number of rows and columns needed. It gives me an errory when i try  $rows = <stdin>;. It says that the rows aren't numeric. Is there any way to make the table interactive? I also tried to add an extra row or an extra column with a click of a button but that seems to fail as well. Any suggestions? Here's my code for adding an extra row:
#!/usr/bin/perl use Tk; use Tk::TableMatrix; my $mw = MainWindow->new; my $arrayVar = {}; print "Filling Array...\n"; my ($rows,$cols) = (10, 10); foreach my $row (1..($rows-1)){ foreach my $col (0..($cols-1)){ $arrayVar->{"$row,$col"} = 2*$row + 3*$col; } } print "Creating Table...\n"; ## Test out the use of a callback to define tags on rows and columns sub colSub{ my $col = shift; return "OddCol" if( $col > 0 && $col%2) ; } my $t = $mw->Scrolled('TableMatrix', -rows => $rows, -cols => $cols, -width => 10, -height => 10, -titlerows => 1, -titlecols => 1, -variable => $arrayVar, -coltagcommand => \&colSub, -browsecommand => \&brscmd, -colstretchmode => 'last', -rowstretchmode => 'last', -selectmode => 'extended', -selecttitles => 0, -drawmode => 'slow', -scrollbars=>'se' ); $mw->Button(-text => "Add", -command => \&add_row) ->pack(-side => 'bottom',-anchor => 'w'); sub add_row { ++$x; my ($rows,$cols) = (10+$x, 10); foreach my $row (1..($rows-1)){ foreach my $col (0..($cols-1)){ $arrayVar->{"$row,$col"} = 2*$row + 3*$col; } } my $t = $mw->Scrolled('TableMatrix', -rows => $rows, -cols => $cols, -width => 10, -height => 10, -titlerows => 1, -titlecols => 1, -variable => $arrayVar, -coltagcommand => \&colSub, -browsecommand => \&brscmd, -colstretchmode => 'last', -rowstretchmode => 'last', -selectmode => 'extended', -selecttitles => 0, -drawmode => 'slow', -scrollbars=>'se' ); }

Replies are listed 'Best First'.
Re^5: Tk ::TableMatrix
by zentara (Cardinal) on Jul 15, 2008 at 16:28 UTC
    If you are going to start modifying rows and cols, you will be better off using a straight TableMatrix, and putting it in a Scrolled Pane. Test for inputs right away, if you want to wait till later to do it, pop up a dialog and ask.
    #!/usr/bin/perl use warnings; use strict; use Tk; require Tk::TableMatrix; require Tk::Pane; # usage programname rows cols my ( $rows, $cols ) = @ARGV; #Then you could test if anything passed: if ( !defined $rows ) { $rows = 4 } if ( !defined $cols ) { $cols = 4 } my $mw = tkinit; $mw->geometry('400x400'); my $tp = $mw->Scrolled('Pane', -sticky => 'nw', )->pack( -fill =>'both', -expand => 1, ); my $bf = $mw->Frame()->pack(); my $t = $tp->TableMatrix( -cols => $cols, -rows => $rows, )->pack(-fill =>'both', -expand => 1 ); $bf->Button(-text=> 'add column', -command=>sub{$t->packPropagate(1); $t->insertCols(0,1); $mw->update; }, )->pack(-side => 'left'); $bf->Button(-text=> 'add row', -command=>sub{$t->packPropagate(1); $t->insertRows(0,1); $mw->update; }, )->pack(-side => 'right'); MainLoop;

    I'm not really a human, but I play one on earth CandyGram for Mongo
      Since the table is user defined, lets say the user makes a mistake so he goes back and sets other values. How do you make the initial table disappear? I tried using destroy() but that just takes off the table completely and doesn't allow it to comeback. Is there another option that just updates the table? For example:
      #!/usr/bin/perl use warnings; use strict; use Tk; require Tk::TableMatrix; require Tk::Pane; my $mw = MainWindow->new; my $arrayVar = {}; my $t; $mw->Button(-text => "Create Table", -command => \&create_table)->pack +(); sub create_table { # usage programname rows cols my ( $rows, $cols ) = @ARGV; #Then you could test if anything passed: if ( !defined $rows ) { $rows = 4 } if ( !defined $cols ) { $cols = 4 } my $mw = tkinit; $mw->geometry('400x400'); my $tp = $mw->Scrolled('Pane', -sticky => 'nw', )->pack( -fill =>'both', -expand => 1, ); my $bf = $mw->Frame()->pack(); my $t = $tp->TableMatrix( -cols => $cols, -rows => $rows, )->pack(-fill =>'both', -expand => 1 ); $bf->Button(-text=> 'add column', -command=>sub{$t->packPropagate(1); $t->insertCols(0,1); $mw->update; }, )->pack(-side => 'left'); $bf->Button(-text=> 'add row', -command=>sub{$t->packPropagate(1); $t->insertRows(0,1); $mw->update; }, )->pack(-side => 'right'); } MainLoop;
        Add these 2 buttons. If your user dosn't like it, tell him to close the program and start over feeding it the right rows and cols. These are easily answered questions if you just read the documentation. You are going to have to start learning to fish for yourself, I'm not going to write all your code for you. Read "perldoc Tk::TableMatrix", and search groups.google.com for things like "perl Tk TableMatrix".

        Also search for things like "Perl Tk::Dialog" so you can ask your users for settings, while the program is running.

        If you want to change the rows/cols in one fell swoop, pop a dialog, asking for the desired rows/cols, then packForget the TableMatrix, use configure on it to set the new rows/cols, then pack it again.

        $bf->Button(-text=> 'del column', -command=>sub{$t->packPropagate(1); $t->deleteCols(0,1); $mw->update; }, )->pack(-side => 'left'); $bf->Button(-text=> 'del row', -command=>sub{$t->packPropagate(1); $t->deleteRows(0,1); $mw->update; }, )->pack(-side => 'right');

        I'm not really a human, but I play one on earth CandyGram for Mongo