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

Hi All, I know it's really horrible, but with Tk800 I could do this:

sub launch_progress { my $main_window = MainWindow->new; my $tk_progressbar = $main_window->ProgressBar( -width => 20, -height => 300, -from => 0, -to => 100, )->pack( -fill=>"x", -pady => 24, -padx => 8 ); $main_window->after(1000, sub{goto ret;}); MainLoop(); ret: return $tk_progressbar; }

The above function creates a window containing a Tk::ProgressBar and then returns to the code that called it within the event triggered by "after".

I know it's nasty, but it worked.

Now, using Tk804, it just freezes, and refuses to work. Does anyone have any idea why?

Replies are listed 'Best First'.
Re: Using a goto in a $main_window->after command
by PodMaster (Abbot) on Jun 04, 2004 at 09:35 UTC
    Now, using Tk804, it just freezes, and refuses to work. Does anyone have any idea why?
    Because its a bad idea (should've never worked)? All MainLoop consists of is
    sub MainLoop { unless ($inMainLoop) { local $inMainLoop = 1; while (Tk::MainWindow->Count) { DoOneEvent(0); } } }
    So just DoOneEvent(0) a couple of times, and then return the progressbar. Example
    use Tk; my $pb = launch_progress(); for(1 .. 100) { $pb->value($_); DoOneEvent(0); select undef, undef, undef, 0.06; warn $_,$/; } undef $pb; exit; sub launch_progress { my $main_window = Tk::MainWindow->new; my $tk_progressbar = $main_window->ProgressBar( -width => 20, -height => 300, -from => 0, -to => 100, )->pack( -fill=>"x", -pady => 24, -padx => 8 ); my $c = 0; while (Tk::MainWindow->Count and $c < 10) { DoOneEvent(0); $c++; } return $tk_progressbar; }

    MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
    I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
    ** The third rule of perl club is a statement of fact: pod is sexy.

      There's a shortcut for the DoOneEvent loop. It's called update() :-)

        Fantastic! That got it working exactly as I intended! Thanks to PodMaster for the idea and the general hint to look at the source code, and to eserte for the improvment.

        By the way for anyone following this, the update method needs to be called on a MainWindow object.