2016-11-22 55 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返回。为了解决这个问题,可以使用Tkrepeat(),而不是sleepTkafter(),并取消在必要时重复:

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; 
    } 
}