2016-11-22 3 views
0

Мне нужен графический вывод из программы Perl. Окно имеет поле состояния label и должно показать, какой программный код решает.Изменение текста метки Tk асинхронно

Как изменить текст поля метки после того, как окно было создано без каких-либо кнопок?

У меня есть следующие:

use Tk; 

$mw = Tk::MainWindow->new(-title => 'Status Window',-bg=>"white");  
$mw->geometry ("400x200+0+0");  

$lala = $mw->Label(-text => "Current Status")->grid(-row=>0,-column=>0);  

$mw->bind('all' => '<Key-Escape>' => sub {exit;}); 

MainLoop; 

Как включить следующую подпрограмму так, чтобы он запускался автоматически после создания окна? Label-Widget не имеет a -command поле. Она должна начаться немедленно и не ждать, пока событие произойдет

sub calculate() { 

    for ($i = 0; $i < 10; $i++) { 
     sleep 2s; 
     $lala->configure(-text=>"Current Status : $i"); 
    } 
} 

ответ

2

Следующая, кажется, работает. Я использовал after() для запуска кода после 100 мс, то используется update() перерисовывать окно:

use feature qw(say); 
use strict; 
use warnings; 

use Tk; 

my $mw = Tk::MainWindow->new(-title => 'Status Window',-bg=>"white");  
$mw->geometry ("400x200+0+0");  
my $lala = $mw->Label(-text => "Current Status")->grid(-row=>0,-column=>0);  
$mw->bind('all'=> '<Key-Escape>' => sub {exit;}); 

$lala->after(100, \&calculate); 
MainLoop; 

sub calculate() { 
    for(my $i=0; $i<10; $i++){ 
     sleep 1; 
     $lala->configure(-text=>"Current Status : $i"); 
     $mw->update(); 
    } 
} 

Редактировать:

Вышеуказанные блоки кода во время sleep 1 вызова, так что любой вход для цикла Tk событий завещает будет задержан. В частности, нажатие Esc для выхода из приложения не будет работать немедленно. Он будет заблокирован до тех пор, пока не вернется sleep. Чтобы решить эту проблему, можно использовать Tk «s repeat() вместо sleep и Tk» s after() и отменить при необходимости повторить:

my $repeat_count = 10; 
my $timer_id = $lala->repeat(1000, \&calculate); 

MainLoop; 

sub calculate() { 
    $lala->configure(-text=>"Current Status : $repeat_count"); 
    if (--$repeat_count == 0) { 
     $timer_id->cancel; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^