in reply to Tk::Pane widget size limit?

Looking at the actual X11 protocol, the 'x' and 'y' offsets within a parent window are signed shorts. It looks like that is the issue you are running into.

Try  $txt = "Double Col $col"; and look closely at the starting labels, and also go to the right end, there are definite signs of wrapping.

Replies are listed 'Best First'.
Re^2: Tk::Pane widget size limit?
by jbuck (Novice) on Aug 24, 2021 at 03:34 UTC
    Very interesting find! That seems like quite an oversight in the X11 protocol; surely there are many programs which would need a sizeable scroll distance, regardless of how many Tk widgets are being managed. Can you think of any way to overcome this through the TK interface?

      Note also that the height and width of a window are passed in unsigned shorts, so that the max width of a window is 65535 pixels. There are not that many displays that are 65535 pixels wide...

      You could ->pack and ->packForget in a non-scrolled Pane using the scrollbar to control which of your large array of Labels are packed. Only pack a screen widths of subwidgets at a time.

      Or only create a screen widths of Label widgets, then change their contents based on the scrollbar.

      Or scroll in two dimensions.

      #!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Pane; my $mw = MainWindow->new(); $mw->geometry('500x500'); my $pane = $mw->Scrolled( 'Pane', -scrollbars => 'se' )->pack( -side = +> 'left', -fill => 'both', -expand => 1 ); my $perrow = 100; foreach my $col ( 1 .. 1000 ) { my $txt = "Col $col"; # doesn't work $pane->Label( -text => $txt, -relief => 'groove', -height => 20, )->grid( -row => int +($col - 1) / $perrow, -column => ($col - 1) % $perrow ); } MainLoop;

      And here's an example of making a fixed number of Labels and changing the data in each with a scrollbar.

      #!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Pane; my $offset = 0; my $labelcount = 7; my $mw = MainWindow->new(); $mw->geometry('500x500'); my $pane = $mw->Scrolled( 'Pane', -scrollbars => 'se' )->pack( -side = +> 'left', -fill => 'both', -expand => 1 ); my @data = map "Col $_", 1 .. 1000; $pane->Scale(-orient => 'horizontal', -from => 0, -to => @data - $labelcount, -variable => \$offset, -command => \&sho +w, -showvalue => 0, )->pack(-fill => 'x', -side => 'bottom'); my @labels = map { $pane->Label( -text => $data[$_], -relief => 'groove', -height => 20, -width => 8, )->pack( -side => 'left' ); } 0 .. $labelcount - 1; MainLoop; sub show { my $i = $offset; for ( @labels ) { $_->configure( -text => $data[$i++] ); } }