异步更改Tk标签的文本
问题描述:
我需要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");
}
}
答
下面似乎工作。我用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()
,而不是sleep
和Tk
的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;
}
}