#!/usr/bin/perl use Tk; #also check out the Pane widget. use Tk::Frame; use Tk::Canvas; use Tk::Button; my $mw = new MainWindow; my $sc = $mw->Scrolled( 'Canvas', -bg => 'black', -scrollbars => 'w', ); my $sf = $sc->Frame( -background => 'Yellow' ); foreach ( 1 .. 100 ) { my $subframe = $sf->Frame(); my $lbl = $subframe->Label( -text => "Entry $_" ) ->pack( -side => 'left', -fill => 'x' ); my $txt = $subframe->Entry()->pack( -side => 'right', -fill => 'x' ); $subframe->pack( -side => 'top', -fill => 'x' ); } # Find the required width / height of our frame... $sf->update; # forces geometry requests to propagate my $f_req_w = $sf->reqwidth; my $f_req_h = $sf->reqheight; print "- Frame needs $f_req_w by $f_req_h\n"; # Configure the scrolled canvas for a best fit... $sc->configure( -scrollregion => [ 0, 0, $f_req_w, $f_req_h ], -width => $f_req_w ); $sc->createWindow( 0, 0, -anchor => 'nw', -window => $sf, -height => $f_req_h, -width => $f_req_w, ); $sc->pack( -expand => 1, -fill => 'both' ); Tk::MainLoop; __END__ #### #!/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, $listboxes ], ); } $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-$count", "four-$count", "five-$count", "six-$count", "seven-$count", "eight-$count", "nine-$count", "ten-$count", "eleven-$count", "twelve-$count", "thirteen-$count", "fourteen-$count", "fifteen-$count", "sixteen-$count", "seventeen-$count", "eighteen-$count", "nineteen-$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); } } __END__