Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: GUI > интервалы в Tk


Автор: kostofffan 6.8.2004, 00:49
Если кто шарит в модуле Tk подскажите плз. Как сделать так, чтобы определенная функция выполнялась с определенным интервалом? (к примеру сделать часы)

Сенкс!

P.S.: alarm не предлагать -- я под виндами )))

Автор: ElectricalStorm 6.8.2004, 08:32
Код

$| = 1;

print "Привет ! \n";

sleep(3);

print "Через 3 секунды\n";


Автор: kostofffan 7.8.2004, 00:46
Нет, вы не поняли. Есть, к примеру, такой кусок кода:
Код
my ($sec, $min, $hour) = map {
   sprintf "%02d", $_;
  } (localtime(time))[0..2];
my $main = MainWindow->new(-title => 'Будильник');
my $frame = $main->Frame()->pack(-anchor => 'n', -pady => 15, -padx => 15);
my $lab = $frame->Label(-text => 'Время')->pack(-side => 'left', -padx => 5);
my $sec_entry = $frame->Entry(-textvariable => \$sec, -relief => 'flat', -width => 2)->pack(-side => 'right');
$frame->Label(-text => ':', -background => 'white')->pack(-side => 'right');
my $min_entry = $frame->Entry(-textvariable => \$min, -relief => 'flat', -width => 2)->pack(-side => 'right');
$frame->Label(-text => ':', -background => 'white')->pack(-side => 'right');
my $hour_entry = $frame->Entry(-textvariable => \$hour, -relief => 'flat', -width => 2)->pack(-side => 'right');
MainLoop;


И нужно, чтобы каждую секунду в полях $sec_entry, $min_entry и $hour_entry обновлялось значение. Но при этом паралельно должны обрабатываться и другие события, к примеру: нажатие какой либо кнопки, ввод в поле и т.д.

Автор: Secandr 7.8.2004, 18:16
Добавить meta тег reload, тогда страница будет обновляться.
Если хочешь обновлять только поля - обновляй невидимый фрейм и javascript путь меняет значение вполях.

Автор: Samot 16.11.2004, 19:32
Для повторения действий, для языков программирования были придуманы цинлы.
В твоем случае можно написать функция(а-ля процедура) и в каждой итерации цикла вызываешь эту функцию. А чтобы через три секунды делаешь вот так:
while ( sleep( 3 ) ) {
main_procedure();
}


Автор: korob2001 17.11.2004, 01:44
Создай цикл, в котором будешь постоянно обновлять преременные $sec, $min, $hour. И на каждой итерации юзай метод update.
Вот короткий пример:
Код

#!/usr/bin/perl -w
use strict;
use Tk;
use encoding "ru_RU.CP1251";
my $mw = new MainWindow;
my($sec, $min, $hour, $full) = ();

my $fr = $mw->Frame->pack( -pady => 15,
                          -padx => 15 );
$fr->Label( -text => 'Время' )->pack( -side => 'left',
                                     -padx => 5 );
my $en = $fr->Entry( -textvariable => \$full,
                    -relief => 'flat',
                    -width => 8 )->pack( -side => 'right' );

while ( 1 ) {
   ( $sec, $min, $hour ) = ( localtime )[0..2];
   $sec = "0$sec" if $sec < 10;
   $min = "0$min" if $min < 10;
   $hour = " $hour" if $hour < 10;
   $full = "$hour:$min:$sec";
   $mw->update;
}

MainLoop;

Удачи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)