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

The following snippet works fine if line 4 reads "my $display = 1;". If 'display' is '0' (zero) instead, the script starts with no errors, but the Tk display does not appear.
I figure the most likely is that I am missing something glaringly obvious. If that is not the case, is there a special way to declare a numeric variable as '0', or am I just a hugely confused person who needs to read his Perl Basics a bit more?
What I particularly can't understand is that, when the display variable starts as '1', and you reset, display is then '0' with no problems.
Any help appreciated :-)

use Tk; use strict; my $init = 0; my $display = 1; my $mw = MainWindow->new; $mw->geometry("300x100"); my $menubar = $mw->Frame()->pack(-side => 'left'); my $mainframe = $mw->Frame(-bg => 'darkblue', -container => 0); $mainframe->pack(-fill => 'both', -side => 'top', -expand => 1); $menubar->Button(-text => "Start", -command => \&start)->pack(-side => + "left"); $menubar->Button(-text => "Stop", -command => \&stop)->pack(-side => " +left"); $menubar->Button(-text => "Reset", -command => \&reset)->pack(-side => + "left"); my $abc = $mainframe->Label(-textvariable => \$display); $abc->pack; $abc->repeat($display, \&update); MainLoop; sub start { $init=1; } sub stop { $init=0; } sub reset { $init=0; $display=0; } sub update { if ($init==1){ $display++; } }

Replies are listed 'Best First'.
Re: Tk not functioning if variable is zero
by Anonymous Monk on Dec 06, 2003 at 02:40 UTC
    What does $abc->repeat(0,\&update) do?

      It means repeat every 0 ms, which is not doable in the real world, unless the task does not take time.

      In the world of computer, the code sucked up all CPU cycles, and the GUI never got a chance to be displayed.

      Modify the update function a little bit, run it, and we will see that the code actually runs, as we get all those "here". But that is the only thing the code has a chance to do.

      use Tk; use strict; my $init = 0; my $display = 0; my $mw = MainWindow->new; $mw->geometry("300x100"); my $menubar = $mw->Frame()->pack(-side => 'left'); my $mainframe = $mw->Frame(-bg => 'darkblue', -container => 0); $mainframe->pack(-fill => 'both', -side => 'top', -expand => 1); $menubar->Button(-text => "Start", -command => \&start)->pack(-side => + "left"); $menubar->Button(-text => "Stop", -command => \&stop)->pack(-side => " +left"); $menubar->Button(-text => "Reset", -command => \&reset)->pack(-side => + "left"); my $abc = $mainframe->Label(-textvariable => \$display); $abc->pack; $abc->repeat($display, \&update); MainLoop; sub start { $init=1; } sub stop { $init=0; } sub reset { $init=0; $display=0; } sub update { #if ($init==1){ print "here\n"; $display++; #} }
        O.k, lets put that down as "missing something glaringly obvious". I had left the $display in the 'repeat' due to something I was trying to do earlier; forgot to remove it. Change it for '1' and all is fine and dandy. Cheers :-)
        I'll think a bit before I post next time.
        Anyone who read my earlier post about Time::Hires, might see what I am eventually trying to achieve. I'm just writing a little stopwatch/countdown timer that doesn't eat up CPU. Was trying to get Time::Hires to help me only cycle a few times per second, rather than constantly updating the display.
        Incidentally, any thoughts on that would be appreciated.