If I understand your desire correctly, you want linked scrollbars. Here is a canvas example, you can probably make it work on other widgets. I use it in my tvguide program.
#!/usr/bin/perl
use warnings;
use strict;
use Tk;
my $mw = new MainWindow();
$mw->geometry("600x400+200+200");
#for xscroll, must be packed before midframe to be visible
my $botframe = $mw->Frame(-bg=>'grey45')
->pack(-fill=>'x',-side=>'bottom');
my $midframe = $mw->Frame(-bg=>'grey45')->pack();
my $midframel = $midframe->Frame(-bg=>'grey45')
->pack(-side=>'left',-expand=>1,-fill=>'y');
my $midframer = $midframe->Frame(-bg=>'grey45')
->pack(-side=>'right');
my $num_channels = 40;
my $canvasp;
my $canvast = $midframer->Canvas(
-bg =>'pale goldenrod',
-width=>2400,
-height=>25,
#need to set scrollregion with a bit extra to ensure
#endpoint accuracy. See xscrollit sub
-scrollregion=>[-10,0,7450,25],
-xscrollincrement => 1,
)->pack(-side=>'top');
#for canvasp and yscroll
my $midframer1 = $midframer->Frame(-bg=>'grey45')
->pack(-side=>'top');
my $yscroll = $midframer1->Scrollbar(
-orient => 'vertical',
-command => \&yscrollit,
-troughcolor =>'grey45',
-activebackground =>'lightseagreen',
-background => 'lightseagreen',
)->pack(-side=>'right',-fill=>'y');
my $canvasxsd = $botframe->Canvas( #dummy filler
-bg =>'grey45',
-width=>75,
-height=>25,
-borderwidth=>0,
) ->pack(-side=>'left');
my $xscroll = $botframe->Scrollbar(
-orient => 'horizontal',
-command => \&xscrollit ,
-troughcolor =>'grey45',
-activebackground =>'lightseagreen',
-background => 'lightseagreen',
)->pack(-side=>'right', -fill=>'x',-expand =>1);
print "$xscroll\n";
$canvasp = $midframer1->Canvas(
-bg =>'lightsteelblue',
-width=>2400,
-height=> 50 * $num_channels,
-scrollregion=>[-10,0,7450,(33 * $num_channels)],
-xscrollincrement => 1,
-yscrollincrement => 1,
-xscrollcommand => [ 'set', $xscroll ],
-yscrollcommand => [ 'set', $yscroll ],
) ->pack(-side=>'left');#,-fill=>'both');
my $canvasd = $midframel->Canvas( #top of left frame dummy filler
-bg =>'grey45',
-width=>75,
-height=>25,
-borderwidth =>0,
)->pack(-side=>'top');
my $canvass = $midframel->Canvas( #left frame canvas
-bg =>'lightseagreen',
-width=>75,
-height=> 50 * $num_channels,
-scrollregion=>[0,0,75,(33 * $num_channels)],
-yscrollincrement => 1,
) ->pack(-side=>'top');
#fill in some sample data to see scrolling action
for( 1 .. 33 * $num_channels){
$canvass->createText(38, 10 + $_ * 33,
-text => "C $_" ,
);
}
#set up top frame canvas... a timeline
for(0..7200){
if( $_ % 300 == 0){
my $time = $_ / 300;
my $padded = ("0" x (2-length( $time ))).$time;
$canvast->createLine($_,0,$_,12,-width=> 4,-tags=>['tick'] );
$canvast->createText($_, 20, -text=> "$padded:00",-tags=>['ti
+ck'] );
}elsif( $_ % 150 == 0){
my $time = ($_ - 150) / 300;
my $padded = ("0" x (2-length( $time ))).$time;
$canvast->createLine($_,0,$_,10,-width => 2,-tags=>['tick']);
$canvast->createText($_, 20, -text=> "$padded:30",-tags=>['ti
+ck'] );
}elsif( $_ % 75 == 0){
$canvast->createLine($_,0,$_,6,-width => 1, -tags=>['tick']);
}
}
#set up main frame canvas
for(0..7200){
$canvasp->createText($_ * 20, 5 + $_ * 20,
-text=> "Test $_",
-tags=>['data'] );
}
#---------------------------------------------------------------
MainLoop;
################################################################
######################################################################
+#
sub xscrollit{
my $fraction = $_[1];
$canvast->xviewMoveto($fraction);
$canvasp->xviewMoveto($fraction);
}
######################################################################
sub yscrollit{
my $fraction = $_[1];
$canvass->yviewMoveto($fraction);
$canvasp->yviewMoveto($fraction);
}
####################################################################
|