2016-11-22 6 views
0

Ich brauche grafische Ausgabe von einem Perl-Programm. Das Fenster hat ein label Statusfeld und sollte zeigen, welcher Programmcode entscheidet.Ändern Sie den Text eines Tk-Label asynchron

Wie ändere ich den Text eines Beschriftungsfelds, nachdem das Fenster ohne Schaltflächen erstellt wurde?

Ich habe folgendes:

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; 

Wie kann ich die folgende Sub-Routine integrieren, so dass es automatisch ausgeführt wird, nachdem das Fenster erstellt wird? Label-Widget hat kein ein -command Feld. Es sollte sofort beginnen und nicht warten, ein Ereignis zu arbeiten passieren

sub calculate() { 

    for ($i = 0; $i < 10; $i++) { 
     sleep 2s; 
     $lala->configure(-text=>"Current Status : $i"); 
    } 
} 

Antwort

2

Die folgende scheint. Ich benutzte after() Code auszuführen, nachdem 100 ms dann update() Fenster neu zu zeichnen verwendet:

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

Edit:

Die obigen Codeblöcke während des sleep 1 Anruf, so dass jeder Eingang für die Tk Ereignisschleife wird wird sich verspäten. Insbesondere wird das Drücken von Esc, um die Anwendung zu beenden, nicht sofort funktionieren. Es wird gesperrt, bis sleep zurückkehrt.

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; 
    } 
} 
: Um das zu lösen, kann man Tk ‚s repeat() statt sleep und Tk‘ s after(), und deaktivieren Sie die Wiederholung bei Bedarf verwenden
Verwandte Themen