Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Help scrolling a series of textboxes with Tk

by jeanine (Acolyte)
on Apr 26, 2002 at 16:31 UTC ( [id://162327]=perlquestion: print w/replies, xml ) Need Help??

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

Hi there,
I am trying to create a GUI with a large number of textboxes which I would like to scroll - not the contents of the boxes but the boxes themselves. I would like to use maxsize to limit the size of the window, but when I do this I am then unable to see all of the textboxes and so would like to add a horizontal scrollbar. I have configured a scrollbar to move the textboxes vertically, but haven't figured out how to add a horizontal scrollbar that essentially moves the frame. Any help would be appreciated, thanks!

I'm using perl v. 5.6.0
and linux 2.4 i386
#!/usr/bin/perl -w use Tk; $top = MainWindow->new(); $top->maxsize(600,300); $NUMCOLS = 10; # Number of columns to display # Create a frame into which all the text boxes will go $frm = $top->Frame()->pack(); # Make and pack the scrollbar $scrollbar = $frm->Scrollbar()->pack(-side => 'left', -fill => 'y'); # Set up textboxes for ($i = 0; $i < $NUMCOLS; $i++) { $block[$i] = $frm->Text( -width => 20, -height => 30, -background => 'white', -yscrollcommand => ['set' => $scrollbar] ); for ($j = 0; $j < 100; $j++) { $block[$i]->insert('end',"$j\n"); } } ## Configure the scrollbar to scroll each textbox $scrollbar->configure(-command => sub { foreach $box (@block) { $box->yview(@_); }}); ## Pack the textboxes foreach $box (@block) { $box->pack(-side => 'left'); } MainLoop();

Edit by tye to add <readmore>

Replies are listed 'Best First'.
(ichi) Re: Help scrolling a series of textboxes with Tk
by ichimunki (Priest) on Apr 26, 2002 at 17:33 UTC
    This may not solve the problem exactly. But here's an example of using one Tk::Text widget to contain other Tk widgets, even other Text widgets.

    #!/usr/bin/perl -w use strict; use Tk; my $MW = MainWindow->new; my $TX = $MW->Scrolled( 'Text', -wrap => 'none' )->pack( -expand => 'y +', -fill => 'both' ); my $t1 = $TX->Scrolled( "Text", width => 20 ); my $t2 = $TX->Scrolled( "Text", width => 20 ); my $t3 = $TX->Scrolled( "Text", width => 20 ); my $t4 = $TX->Scrolled( "Text", width => 20 ); my $t5 = $TX->Scrolled( "Text", width => 20 ); $TX->window('create', 'end', -window => $t1); $TX->window('create', 'end', -window => $t2); $TX->window('create', 'end', -window => $t3); $TX->window('create', 'end', -window => $t4); $TX->window('create', 'end', -window => $t5); MainLoop;
    It is left as an exercise for the reader to get all that to size in an eye-pleasing way.

    PS in 'perldoc Tk::Scrollbar' there is mention of an '-orient' attribute, but attempts to use it (on my machine) fail. Very disappointing.

    I also suggest looking at a scrolling Tk::Canvas widget as the container for multiple widgets, but don't have a facile example since Canvas is a little more complex. The 'widget' demo offers some hints, but nothing to latch onto.
      Very nice ichimunki,

      I was trying to get this to work but couldn't get the 'x' scroll bar to work until I added -wrap => 'none',, which I was going to mention in the original version of my reply, but between your original post and my figuring out what to do, you had already figured it out for yourself (or maybe you already knew and just forgot to add it the first time).

      BTW, the -orient is only for hand-created scrollbars. Using the Scrolled method, you want to use the -scrollbars => 'osoe' option, which, in this case, assigns two optional scrollbars (the 'o' portion), one on the 's'outh, and one on the 'e'ast. You can assign the scrollbars to the four sides, and each can be made optional (put the 'o' before the direction portion).

        -orient: Yes. I meant that I was trying to add an 's' scrollbar to the original code offered by jeanine. But when I added it, instead of getting a horizontal scrollbar across the bottom I got a vertical scroll on the bottom! Which is why I attempted to use the -orient option which is listed in the perldoc (although no valid values are given for it), but failed on my installation.

        And yes, stuffing things into Tk::Text widgets gets a bit tricky (since you have to remember things like wrapping)... which is why I pointed out Tk::Canvas-- but Canvas widgets require a lot more thought and planning to use effectively.
Re: Help scrolling a series of textboxes with Tk
by {NULE} (Hermit) on Apr 26, 2002 at 21:30 UTC
    Hi jeanine,

    Frame doesn't like scrolling which is why Tk::Pane was invented. With it you can use Pane inside of a Scrolled method like so:

    #!/usr/bin/perl -w use Tk; use Tk::Pane; $top = MainWindow->new(); $top->maxsize(600,300); $NUMCOLS = 10; # Number of columns to display # Create a frame into which all the text boxes will go $frm = $top->Scrolled( 'Pane', -height => 299, -width => 599, -sticky => 'we', -scrollbars => 'soe' )->pack(-fill => 'both', -expand => 1); # Set up textboxes for ($i = 0; $i < $NUMCOLS; $i++) { $block[$i] = $frm->Text( -width => 20, -height => 30, -background => 'white' ); for ($j = 0; $j < 100; $j++) { $block[$i]->insert('end',"$j\n"); } } ## Pack the textboxes foreach $box (@block) { $box->pack(-side => 'left'); } MainLoop();
    Hope this helps,
    {NULE}
    --
    http://www.nule.org

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://162327]
Approved by DaWolf
Front-paged by DaWolf
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (4)
As of 2024-04-23 06:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found