vikee has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

I have 2 scrolled listboxes tied together. I need only one scrollbar, how can i remove one and still have the same functionality?

or is there a different solution to make sth similar?

here's the code:
use strict; use Tk; use Tk::TiedListbox; my $top = MainWindow->new; my $f = $top->Frame->pack(-expand => 'yes', -fill => 'both'); ########################################################### # 2 scrolled listboxes my $l1 = $f->ScrlListbox(-relief => 'flat', -exportselection => 0, -selectmode => 'extended',-height => 20); my $l2 = $f->ScrlListbox(-relief => 'flat', -exportselection => 0, -selectmode => 'extended',-height => 20, ); $l1->pack(-expand => 'yes', -side => 'left'); $l2->pack(-expand => 'yes', -side => 'left'); # tie the scrollbars and selection $l2->tie([$l1->Subwidget('scrolled')]); ########################################################## # my $id; foreach $id (0..300){ $l1->insert('end', $id); $l2->insert('end', $id); } MainLoop();
thanks

Formatting fixed by holli (removed pre tags)

Replies are listed 'Best First'.
Re: TiedListbox remove scrollbar
by thundergnat (Deacon) on Jun 21, 2005 at 16:34 UTC

    Perhaps I'm missing something here. If you don't want both of the Listboxes to be scrolled, then don't create them both as scrolled Listboxes.

    use strict; use Tk; use Tk::TiedListbox; my $top = MainWindow->new; my $f = $top->Frame->pack(-expand => 'yes', -fill => 'both'); ########################################################### # 2 scrolled listboxes my $l1 = $f->ScrlListbox(-relief => 'flat', -exportselection => 0, -selectmode => 'extended',-height => 20); my $l2 = $f->Listbox(-relief => 'flat', # <-- Not Scrolled!! -exportselection => 0, -selectmode => 'extended',-height => 20, ); $l1->pack(-expand => 'yes', -side => 'left'); $l2->pack(-expand => 'yes', -side => 'left'); # tie the scrollbars and selection $l2->tie([$l1->Subwidget('scrolled')]); ########################################################## # my $id; foreach $id (0..300){ $l1->insert('end', $id); $l2->insert('end', $id); } MainLoop();

      If I understood correctly, she wants both listboxes to scroll in concert ("tied together"), not one that scrolls and one that doesn't.

      Vikee, I don't know the answer, but I think one normally achieves this by putting both columns in one listbox. In other words, instead of having a listbox of strings, you'd have one of two-field records.

        Did you run the code I posted? What part of it doesn't resemble two listboxes that scroll in sync ("tied together") using only one scrollbar?

        It certainly works that way for me on Win2k & WinXP, Perl 5.8.6, Tk 804.027.

Re: TiedListbox remove scrollbar
by zentara (Cardinal) on Jun 22, 2005 at 12:01 UTC
    Here is another snippet (from google) to demonstrate it slightly differently from thundergnat's example.
    #!/usr/bin/perl use warnings; use strict; use Tk; my $list; my $parent; my $mw = MainWindow->new(); $mw->title("Listbox"); $mw->geometry("600x300+100+100"); $mw->Button( -text => "Exit", -command => sub { exit } )->pack( -side => 'bottom', -fill => 'x' ); $parent = $mw->Listbox()->pack( -side => 'left', -fill => 'y', -expand + => 1 ); my $yscroll = $parent->Scrollbar(-orient => 'vertical'); my $listboxes = [ $parent->Listbox(), $parent->Listbox(), $parent->Listbox(), $parent->Listbox(), ]; foreach $list (@$listboxes) { $list->configure( -yscrollcommand => [ \&scroll_listboxes, $yscroll, $list, $li +stboxes ], ); } $yscroll->configure( -command => sub { foreach $list (@$listboxes) { $list->yview(@_); } } ); $yscroll->pack( -side => 'left', -fill => 'y' ); my $count = 0; foreach $list (@$listboxes) { $list->insert( 'end', "one-$count", "two-$count", "three-$coun +t", "four-$count", "five-$count", "six-$count", "seve +n-$count", "eight-$count", "nine-$count", "ten-$count", "elev +en-$count", "twelve-$count", "thirteen-$count", "fourteen-$count", "fift +een-$count", "sixteen-$count", "seventeen-$count", "eighteen-$count", "nine +teen-$count", "twenty-$count" ); $count++; $list->pack( -side => 'left', -fill => 'y', -expand => 1 ); } MainLoop; sub scroll_listboxes { my ( $sb, $scrolled, $lbs, @args ) = @_; $sb->set(@args); my ( $top, $bottom ) = $scrolled->yview(); foreach $list (@$lbs) { $list->yviewMoveto($top); } } ##############################################################

    I'm not really a human, but I play one on earth. flash japh