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

Hello Monks,

I have a large script which generates a progress window while doing several computation steps.

But, although using ->pack(-anchor=>'nw');, the text in the progress window appears in the middle of the window.

This overcharges my lore...

#!/usr/bin/perl -w use Tk; use Tk::Pane; $mw=MainWindow->new(); $mw->geometry("100x100"); $mw->Button(-text=>"START",-command=>\&start_computation)->pack; MainLoop; sub start_computation { $progress=$mw->Toplevel(); $progress->geometry("100x100"); $pane=$progress->Scrolled('Pane',-scrollbars=>'osoe')->pack(-fill= +>'both',-expand=>1); $text="Computation started...\n"; $label=$pane->Label(-text=>$text)->pack(-anchor=>'nw'); # doing several computation steps foreach$step(1..10) { sleep(1); $text.="Step $step finished.\n"; $label->destroy; $label=$pane->Label(-text=>$text)->pack(-anchor=>'nw'); $pane->update; } $text.="\nComputation finished.\n"; $label->destroy; $label=$pane->Label(-text=>$text)->pack(-anchor=>'nw'); $pane->update; $pane->Button(-text=>"QUIT",-command=>sub{exit;})->pack; }

Replies are listed 'Best First'.
Re: Perl Tk: pack option does't work
by kcott (Archbishop) on Dec 02, 2010 at 11:34 UTC

    That's a common mistake. I used make the same mistake myself. Don't panic! Tk::pack isn't broken.

    Many widgets (including Tk::Label) have an -anchor option (see Tk::options). This option anchors the contents of the widget - typically text or an image. This is what you should be using, i.e. Label(-text => $text, -anchor => 'nw').

    Tk::pack also has an -anchor option. pack() operates on the widget as a whole - it doesn't affect the contents of the widget. If, after normal packing, there's was free space to the north-west of the widget, pack(-anchor => 'nw') would move the entire widget in that direction. That's a simplistic description: read the full documentation for details of allocation rectangles, cavities and the packer algorithm.

    -- Ken

Re: Perl Tk: pack option does't work
by Khen1950fx (Canon) on Dec 02, 2010 at 09:05 UTC
    Try this:
    #!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Pane; my $mw = MainWindow->new(); $mw->geometry("100x100"); $mw->Button( -text => "START", -command => \&start_computation )->pack +; MainLoop; sub start_computation { my $progress = $mw->Toplevel(); $progress->geometry("100x100"); my $pane = $progress->Scrolled( 'Pane', -scrollbars => 'soe', -sticky => 'we', -gridded => 'y' )->pack( -fill => 'both', -expand => 1 ); my $text = "Computation started...\n"; $pane->Frame; my $label = $pane->Label( -text => $text )->pack( -side => 'left', -fill => +'x' ); # doing several computation steps foreach my $step ( 1 .. 10 ) { sleep(1); $text .= "Step $step finished.\n"; $label->destroy; $label = $pane->Label( -text => $text )->pack( -side => 'left' + ); $pane->update; } $text .= "\nComputation finished.\n"; $label->destroy; $label = $pane->Label( -text => $text )->pack( -side => 'left' ); $pane->update; $pane->Button( -text => "QUIT", -command => sub { exit; } )->pack; }
Re: Perl Tk: pack option does't work
by Anonymous Monk on Dec 02, 2010 at 09:53 UTC
    the text in the progress window appears in the middle of the window.

    There is no need to create/destroy labels, this is how you should write that

    #!/usr/bin/perl -- use strict; use warnings; use Tk; use Tk::Pane; my $mw = MainWindow->new(); $mw->geometry("100x100"); $mw->Button( -text => "START", -command => \&start_computation )->pack +; MainLoop; sub start_computation { my $progress = $mw->Toplevel(); $progress->geometry("100x100"); my $pane = $progress->Scrolled( 'Pane', -scrollbars => 'osoe', -background => 'red', )->pack( -fill => 'both', -expand => 'yes', ); my $text = "Computation started...\n"; my $label = $pane->Label( -textvariable => \$text, )->pack( -side => 'right', ); # doing several computation steps for my $step ( 1 .. 10 ) { sleep(1); $text .= "Step $step finished.\n"; $pane->update; } $text .= "\nComputation finished.\n"; $pane->update; $pane->Button( -text => "QUIT", -command => sub { exit; } )->pack( -anchor => 'nw', ); return; } ## end sub start_computation
    It doesn't fix the centering/layout issue, maybe this tutorial can help