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ます。これを解決するには、 andTkrepeat()代わりに を使用し、必要に応じて繰り返しをキャンセルします。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;
    }
}
于 2016-11-22T16:32:23.693 に答える