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:

  1. #!perl
  2. use strict;
  3. use Tk;
  4. use Tk::TiedListbox;
  5. my $mw = MainWindow->new;
  6. my $f = $mw->Frame->pack( -expand => 'yes', -fill => 'both' );
  7. my $l1 = $f->ScrlListbox(
  8. -relief => 'flat',
  9. -exportselection => 0,
  10. -selectmode => 'extended',
  11. -height => 20
  12. );
  13. my $l2 = $f->ScrlListbox(
  14. -relief => 'flat',
  15. -exportselection => 0,
  16. -selectmode => 'extended',
  17. -height => 10
  18. );
  19. my $l3 = $f->ScrlListbox(
  20. -relief => 'flat',
  21. -exportselection => 0,
  22. -selectmode => 'extended',
  23. -height => 20,
  24. );
  25. # Checkbutton-Variablen:
  26. my ( $bv1, $bv2 );
  27. my $b1 = $f->Checkbutton(
  28. -text => 'tie selection',
  29. -variable => \$bv1,
  30. -command => [ \&set_tie, \$bv1, \$bv2 ]
  31. );
  32. my $b2 = $f->Checkbutton(
  33. -text => 'tie scroll',
  34. -variable => \$bv2,
  35. -command => [ \&set_tie, \$bv1, \$bv2 ]
  36. );
  37. $b1->pack( -side => 'bottom' );
  38. $b2->pack( -side => 'bottom' );
  39. $l1->pack( -expand => 'yes', -side => 'left' );
  40. $l2->pack( -expand => 'yes', -side => 'left' );
  41. $l3->pack( -expand => 'yes', -side => 'left' );
  42. foreach my $id ( 0 .. 300 ) {
  43. $l1->insert( 'end', $id ) if $id <100; $l2->insert( 'end', $id );
  44. $l3->insert( 'end', $id );
  45. }
  46. $b1->invoke;
  47. $b2->invoke;
  48. $mw->MainLoop;
  49. exit(0);
  50. sub set_tie {
  51. my ( $b1, $b2 ) = @_;
  52. my ( $x1, $x2, $x3 ) = map( $_->Subwidget('scrolled'), $l1, $l2, $l3 );
  53. $x1->tie( 'all', [ $x2, $x3 ] ), return if ( $$b1 && $$b2 );
  54. $x1->tie( 'selection', [ $x2, $x3 ] ), return if ($$b1);
  55. $x1->tie( 'scroll', [ $x2, $x3 ] ), return if ($$b2);
  56. $x1->untie, $x2->untie, $x3->untie;
  57. }
Top