I have been struggling for the last couple of hours to get the column width working.
I implemented a soft autosizing function that works sufficiently.
What does not work, however, is when I have finished all my grids and just want to adapt the main window to cover all the TableMatrices (I have several, but the problem goes already for a single one). My legacy solution to this is to call reqwidth and then update the main window's geometry accordingly, to a certain limit. Geometry handlers should handle the rest.
But it seems that the reqwidth reported is not the actual widths after calling ->colWidth. I guess it is some pixel/character issue.
Appended some not working code for autosizing at the end of the above example:
Strangely enough, the reqwidth is updated (637 without->827 with colWidth), but not to the value required to show the whole TableMatrix.
use strict; # https://perlmonks.org/?node_id=11140544
use warnings;
use Tk;
use Tk::TableMatrix;
my ($nrows, $ncolumns) = (10, 10);
my $mw = MainWindow->new();
$mw->configure(-title=> "TableMatrix Demo");
$mw->geometry("600x800+0+0");
my $buttonbar = $mw->Frame(-bg => 'blue',
)->pack(-fill => 'x');
$buttonbar->Button(-text => 'Exit', -command => sub{$mw->destroy},
)->pack(-side => 'right', -fill => 'x', -expand => 1);
$buttonbar->Button(-text => 'Set Size', -command => sub{},
)->pack(-side => 'right', -fill => 'x', -expand => 1);
$buttonbar->Button(-text => 'Remove Column',
-command => sub{},
)->pack(-side => 'right', -fill => 'x', -expand => 1);
my %MainHash;
my $tMain=\%MainHash; #main data structure for the TableMatrix
my $table_frame = $mw->Frame(-height=>'10',-width=>'10',
-relief=>'groove',-borderwidth=>'3'
)->pack(-expand=>1, -fill=>'both',-pady=>'0');
my @col_heads = map{"Col Head $_"}0..$ncolumns;
###
### Main TableMatrix object
###
my $table = $table_frame->Scrolled('TableMatrix',
-cols => 10,
-rows =>10, #fixed number of rows!!! need to grow this dynamically
+!
#I forget how I did this, but it is possible
# -width => 5, #minimum width in columns to be shown
# -height => 10, #minimum number of rows to be shown - seems to limit!
+! not Min!??
-titlerows => 1,
-variable => $tMain,
-selectmode => 'single',
# -state => 'disabled', # no direct editing of cells
-resizeborders => 'col',
-bg => 'white',
-rowheight => 1, #make row display more compact....
-bd => [0,1,0,1],
-justify => 'left',
-drawmode => 'compatible',
-wrap => 1,
-relief => 'solid',
-scrollbars=>'se',
-exportselection =>1,
)->pack(-expand =>1, -fill=>'both');
foreach my $row (0..$nrows-1)
{
foreach my $col (0..$ncolumns-1)
{
$tMain->{"$row,$col"} = "row $row col $col";
}
}
set_col_width($table,@col_heads); #THIS WILL CAUSE A SCREEN REFRESH!
sub set_col_width{
(my $table, my @col_head) = @_;
my $i=0;
foreach my $col (@col_head){
$table->colWidth($i++, length($col)+4);
}
}
$mw->update;
$table->update;
$table_frame->update; #Needed
my $rw = $table_frame->reqwidth;
print "RW:".$rw."\n";
$mw->geometry($rw."x800+0+0");
MainLoop;
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.