Forum Webscript.Ru
Программирование => Perl => Тема начата: cr4ck3r от 22 Апреля 2005, 10:52:46
-
В общем, потребовалось к программке добавить прогресс бар. И все бы хорошо, но проблема в том что йентот прогресс бар почему-то не хочет обновлятся в режиме реального времени - а просто после выполнения задачи - рисует полосочку. Но уже ПОСЛЕ выполнения. :\\\\.. Как заставить ее отображать реальность - а не прошедшее время?
Для простоты понимания - набросал тестовый скриптик. Тут рисуется пару окошек, и пару кнопок. На кривизну не обращайте внимание - это для примера.
#!perl -w
use Tk;
use Tk::ProgressBar;
use Tk::Toplevel;
my $val=1;
$mw = MainWindow->new();
$mw->geometry( \'250x150\' );
$mw->resizable( 1, 0 );
$mw->Button(-text=>"add",-command=>\\&Add)->pack( -padx=>15, -pady=>15,
-anchor=>\'se\' );
sub Add {
my $toplevel=$mw->Toplevel();
my $but=$toplevel->Button(-text=>\'Add\')->pack( -padx=>15, -pady=>15,-anchor=>\'se\' );
my $but2=$toplevel->Button( -text=>\'Quit\', -command=>sub{ $toplevel->destroy() } )->pack( -padx=>15, -pady=>15, -anchor=>\'se\' );
my $bar = $toplevel->ProgressBar( -padx=>2, -pady=>2, -borderwidth=>2,-blocks => 18,
-troughcolor=>\'#BFEFFF\', -colors=>[ 0, \'#104E8B\' ],
-length=>106,-variable=>\\$val)->pack;
my $bar2 = $toplevel->ProgressBar( -padx=>2, -pady=>2, -borderwidth=>2,-blocks => 18,
-troughcolor=>\'#BFEFFF\', -colors=>[ 0, \'#104E8B\' ],
-length=>106,-variable=>\\$val)->pack;
$but->configure( -command=>[ \\&fct] );
}
MainLoop;
sub fct {
while($val<100) {
$val++;
Addz($val);
}
}
sub Addz {
my $val2=shift;
$val2=5000+$val2;
for(;$val2>1 ; ) {
$val2--;
my $data=localtime()
}
}
Функция Addz - просто несет нагрузку - ничего более (для того чтобы понять что прогресс бар появляется потом а не во время выполнения).
Я пробовал работать с прогрессбаром и через опцию -variable, и через метод
$bar->value($num);
результат один и тот же.
Подскажите плиз как быть?
-
Все - проблема решена. Надо использовать метод update. Кстати я нашел книгу "Mastering Perl/Tk" - кого интересует эта тема пишите.
-
Гдебы взять эту книжечку?
-
>>Здесь<< (http://poizon.net.ru/?s=4;f=6)
-
use strict;
use Tk;
use Tk::ProgressBar;
my $parent = MainWindow->new(-title => \'Save\');
my $percent_done = 0;
my $position = 10;
my $progress = $parent->ProgressBar(
-width => 20,
-length => 200,
#-anchor => \'s\',
-from => 0,
-to => 100,
-blocks => 10,
-colors => [0, \'green\', 50, \'yellow\' , 90, \'red\'],
#-variable => \\$percent_done
)->pack();
my $ida = $parent->repeat(500, \\&_repeat);
MainLoop;
sub _repeat{
$progress->value($position);
if(($position += 10) > 100){
$parent->afterCancel($ida);
}
}