0

我需要 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");
    }
}
4

1 回答 1

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'srepeat()代替sleepand 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;
    }
}
于 2016-11-22T16:32:23.693 回答