Асинхронно изменить текст метки Tk

Мне нужен графический вывод из программы 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");
    }
}

person Tina    schedule 22.11.2016    source источник


Ответы (1)


Следующее, кажется, работает. Я использовал 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 не вернется. Чтобы решить эту проблему, можно использовать repeat() Tk вместо sleep и after() Tk и при необходимости отменить повтор:

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;
    }
}
person Håkon Hægland    schedule 22.11.2016