异步更改Tk标签的文本

时间:2016-11-22 16:13:06

标签: perl tk perltk

我需要Perl程序的图形输出。该窗口有一个label状态字段,应该显示编程代码决定的内容。

如何在没有任何按钮的情况下创建窗口后更改标签字段的文本?

我有以下内容:

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没有 一个-command字段。它应该立即开始  不等待事件发生

sub calculate() {

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

1 个答案:

答案 0 :(得分: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 repeat()代替sleepTk&#39; 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;
    }
}
相关问题