Tk::TiedListbox - Listboxen gleichzeitig scrollen und anwählen

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;
}
Top