Hat man zwei oder mehr Listboxen, die man gleichzeitig scrollen möchte, dann sollte man einen Blick auf das Modul Tk::TiedListbox werfen. Nicht nur das Scroll-Ereignis, sondern auch der Klick auf ein Element in der Listbox kann synchronisiert werden. Die Listboxen sind sozusagen miteinander verbunden.
Dem Perl/Tk-Modul liegt ein Beispiel-Programm bei:
#!perl
use strict;
use Tk;
use Tk::TiedListbox;
my $mw = MainWindow->new;
my $f = $mw->Frame->pack( -expand => 'yes', -fill => 'both' );
my $l1 = $f->ScrlListbox(
-relief => 'flat',
-exportselection => 0,
-selectmode => 'extended',
-height => 20
);
my $l2 = $f->ScrlListbox(
-relief => 'flat',
-exportselection => 0,
-selectmode => 'extended',
-height => 10
);
my $l3 = $f->ScrlListbox(
-relief => 'flat',
-exportselection => 0,
-selectmode => 'extended',
-height => 20,
);
# Checkbutton-Variablen:
my ( $bv1, $bv2 );
my $b1 = $f->Checkbutton(
-text => 'tie selection',
-variable => \$bv1,
-command => [ \&set_tie, \$bv1, \$bv2 ]
);
my $b2 = $f->Checkbutton(
-text => 'tie scroll',
-variable => \$bv2,
-command => [ \&set_tie, \$bv1, \$bv2 ]
);
$b1->pack( -side => 'bottom' );
$b2->pack( -side => 'bottom' );
$l1->pack( -expand => 'yes', -side => 'left' );
$l2->pack( -expand => 'yes', -side => 'left' );
$l3->pack( -expand => 'yes', -side => 'left' );
foreach my $id ( 0 .. 300 ) {
$l1->insert( 'end', $id ) if $id <100; $l2->insert( 'end', $id );
$l3->insert( 'end', $id );
}
$b1->invoke;
$b2->invoke;
$mw->MainLoop;
exit(0);
sub set_tie {
my ( $b1, $b2 ) = @_;
my ( $x1, $x2, $x3 ) = map( $_->Subwidget('scrolled'), $l1, $l2, $l3 );
$x1->tie( 'all', [ $x2, $x3 ] ), return if ( $$b1 && $$b2 );
$x1->tie( 'selection', [ $x2, $x3 ] ), return if ($$b1);
$x1->tie( 'scroll', [ $x2, $x3 ] ), return if ($$b2);
$x1->untie, $x2->untie, $x3->untie;
}100;>