in reply to TK Timed action
Hi, Tk::after is usually used for a one-shot delay. What you want is Tk::repeat. Try
and you will not need to repeatedly call Tk::after in your sub.my $repeater = $mw->repeat(1000, \&sub); .... $repeater->cancel; # when you want to stop it
Here is a basic example:
#!/usr/bin/perl use Tk; use warnings; use strict; my $mw = MainWindow->new(title => "Timer"); my $elapsed_sec = 0; my $elapsed_sec_label = $mw->Label(-textvariable => \$elapsed_sec)->pa +ck(); my $repeater; # declare first so it can be accessed in the callback $mw->Button(-text => "reset", -command => sub { $elapsed_sec = 0; &repeater(); })->pack(); $mw->Button(-text => "exit", -command => sub { exit })->pack(); # start first run &repeater(); MainLoop; sub repeater{ #this is repeated every second, and you can put your is_playing here $repeater = $mw->repeat(1000 => sub { $elapsed_sec ++; if ($elapsed_sec > 4){ $repeater->cancel } } ); }
|
|---|