Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

How to scroll MainWindow , consists of many frames

by AlokMandal (Initiate)
on Apr 30, 2020 at 11:37 UTC ( #11116270=perlquestion: print w/replies, xml ) Need Help??

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

So , i created multiple frames using "For loop" purposefully, not unintentionally. what i observe that, Mainwindow is not able to show all those frame, i need to add scrollbar so that i can scroll down and see them. But since we can't add scrollbars directaly to MainWindow ? is there any way to scroll down .

for my $i(@array) { @var=split('=',$i); my $frame=$mw->Frame()->pack(); my $label_index=$frame->Label(-text=>"$x",-width=>10,-relief=>'gro +ove')->pack(-side=>"left"); my $label_name=$frame->Label(-text=>"$var[0]",-width=>30,-relief=> +'groove')->pack(-side=>"left"); my $label_value=$frame->Label(-text=>"$var[1]",-width=>25,-relief= +>'groove')->pack(-side=>"left"); my $label_description=$frame->Entry(-text=>"description",-width=>3 +0,-relief=>'groove')->pack(-side=>"left"); $x=$x+1; }

there are 100's of entries inside array, so loop will generate that much frames.



Replies are listed 'Best First'.
Re: How to scroll MainWindow , consists of many frames
by choroba (Cardinal) on Apr 30, 2020 at 11:56 UTC
    I guess you're using Tk.

    To add scrollbars, use the Tk::Scrolled. For example, you can create a top scrolled frame:

    #!/usr/bin/perl use warnings; use strict; use Tk; my $mw = 'MainWindow'->new; my @array = map join('=', int rand 100), 1 .. 100; my $top = $mw->Scrolled('Frame', -scrollbars => 'e')->pack; my $x = 0; for my $pair (@array) { my ($name, $value) = split /=/, $pair; my $frame = $top->Frame->pack; my $label_index = $frame->Label(-text => $x, -width => 10, -relief => 'groove') ->pack(-side => 'left'); my $label_name = $frame->Label(-text => $name, -width => 30, -relief => 'groove') ->pack(-side => 'left'); my $label_value = $frame->Label(-text => $value, -width => 25, -relief => 'groove') ->pack(-side => 'left'); my $label_description = $frame->Entry(-text =>'description', -width => 30, -relief =>'groove') ->pack(-side=>'left'); ++$x; } MainLoop();

    Note that my example is runable as is, while yours isn't (I had to guess the format of the array values, etc.) Also, adding a space here or there improves readability.

    The first argument of split is a regex or a space. Also, I prefer single quotes for strings that don't interpolate anything, and no quotes for strings that only interpolate a single variable.

    Update: The array is populated wrongly. See Lotus1's reply for a fix.

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

      I usually learn something from your code so I tend to read it carefully. I noticed that the join() inside the map() is only joining one item so there won't be a '='. When I run your example the third column is blank. The split /=/, $pair; section is only populating $name. I was able to fix it by placing a second int rand 100 inside the join().

      After a few more tweaks I ended up with this:

      #!/usr/bin/perl use warnings; use strict; use Tk; use Tk::Pane; my $mw = 'MainWindow'->new; my @array = map join('=', $_, int rand 100, int rand 100), 1 .. 100; my $top = $mw->Scrolled('Frame', -scrollbars => 'e')->pack; for my $pair (@array) { my ($x, $name, $value) = split /=/, $pair; print "pair=$pair, name=$name, value=$value\n"; my $frame = $top->Frame->pack; my $label_index = $frame->Label(-text => $x, -width => 10, -relief => 'groove') ->pack(-side => 'left'); my $label_name = $frame->Label(-text => $name, -width => 30, -relief => 'groove') ->pack(-side => 'left'); my $label_value = $frame->Label(-text => $value, -width => 25, -relief => 'groove') ->pack(-side => 'left'); my $label_description = $frame->Entry(-text =>'description', -width => 30, -relief =>'groove') ->pack(-side=>'left'); } MainLoop();
        Thanks for the fix, I originally had a map inside a map there and wanted to simplify it, but didn't check the results or copied a wrong phase of the change.

        map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
Re: How to scroll MainWindow , consists of many frames
by AnomalousMonk (Archbishop) on Apr 30, 2020 at 17:45 UTC

    As a side note, the lexicals  $label_index $label_name $label_value $label_description are scoped entirely within the for-loop of the OPed code and any values assigned to them vanish at the end of that loop. I assume you're saving these values into some structure in an enclosing scope, but if you're not, you can save your eyesight and fingertips by getting rid of them.

    Also, your use of  @var and  $x in the (pseudo?) code suggests you're not using strict and warnings. If that's actually the case and not just an artifact of the example, use strict and warnings. :) The runnable example code of choroba and Lotus1 handle these variables "correctly" IMHO.

    Give a man a fish:  <%-{-{-{-<

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://11116270]
Approved by davies
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (6)
As of 2023-12-04 02:46 GMT
Find Nodes?
    Voting Booth?
    What's your preferred 'use VERSION' for new CPAN modules in 2023?

    Results (20 votes). Check out past polls.