我需要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");
}
}
答案 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()
代替sleep
和Tk
&#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;
}
}