O'Reilly logo

Mastering Perl/Tk by Nancy Walsh, Stephen Lidie

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

The ProgressBar Widget

Using a ProgressBar is a great way to show the user something is still happening when you are doing lots of processing. Without it, the user wonders, “Is the application still running? Why isn’t it responding?” Figure 23-18 shows what a fairly typical progress bar looks like. This screenshot was generated with the following code:

use Tk;
use Tk::ProgressBar;

my $mw = MainWindow->new(-title => 'ProgressBar example');

$progress = $mw->ProgressBar(
        -width => 30,
        -from => 0,
        -to => 100,
        -blocks => 50,
        -colors => [0, 'green', 50, 'yellow' , 80, 'red'],
        -variable => \$percent_done
    )->pack(-fill => 'x');

$mw->Button(-text => 'Go!', -command=> sub {
   for ($i = 0; $i < 1000; $i++) { 
     $percent_done = $i/10;
     print "$i\n";
     $mw->update;  # otherwise we don't see how far we are.
  }
 })->pack(-side => 'bottom');

MainLoop;
A ProgressBar

Figure 23-18. A ProgressBar

The callback that is part of the Go button is just a quick way of showing how to do something and update the ProgressBar as part of the process. You could be loading a file, doing some number crunching, or anything else that seems to cause your program to pause.

ProgressBar Options

Here is a list of options available for ProgressBar:

-anchor => 'n' | 's' | 'e' | 'w'

Determines the starting point of the bar. For horizontal bars (such as our example), use 'e' or 'w'. Vertical bars use 's' or 'n'.

-blocks => number

The number of blocks ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required