2016-11-22 14 views
0

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"); 
    } 
} 

答えて

2

次のように動作しているようです。 100ミリ秒は、ウィンドウを再描画するupdate()を使用した後、私は、コードを実行するためにafter()を使用:

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が返されるまでブロックされます。この問題を解決するためには、使用Tkrepeat()代わりの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; 
    } 
} 
関連する問題