2012-03-08 2 views
0

Я пишу сценарий, помогающий людям, которые сканируют штрих-код и получат ответ, чтобы сохранить или удалить отсканированный образец. Я хочу иметь сообщение, похожее на текстовый ящик tk или Win32 :: MsgBox, но тот, который не требует от пользователя взаимодействия через три секунды.Pop up in perl, который автоматически исчезает после паузы

ответ

2

Моя мысль заключалась в том, чтобы создать сообщения в дочернем процессе, используя alarm, чтобы убить процесс после задержки. В Tk:

sub tmpMsgBox { 
    my ($message,$delay) = @_; 
    if (fork() == 0) { 
     my $topWin = MainWindow->new; 
     my $label = $topWin->Label(); 
     my $ok = $topWin->Button(); 
     $label->pack(-side => 'top'); 
     $ok->pack(-side => 'bottom'); 
     $label->configure(-text => $message); 
     $ok->configure(-text => 'Ok', -command => sub {exit}); 

     $SIG{ALRM} = sub {exit}; 
     alarm $delay || 1; 
     $topWin->MainLoop; 
    } 
} 

for (3..10) { 
    tmpMsgBox("This window will disappear in $_ seconds", $_); 
} 

Я не думаю, что Ки играют хорошо с fork, хотя, так что эта идея, вероятно, не будет работать так хорошо, если вы также используете Tk в основном процессе.

1

Desktop::Notify - это стандартно-совместимый интерфейс к всплывающим всплывающим уведомлениям на рабочем столе.

perl -MDesktop::Notify -e' 
    Desktop::Notify 
     ->new 
     ->create(
      body => q{why hello there}, 
      timeout => 3000 
     )->show' 
0

То, что вы хотите сделать, это отправить сообщение уничтожить в окно после тайм-аута (напомним, чтобы отменить отправку сообщения, если пользователь делает выбор что-то!) Tk, безусловно, способны сделать это.

# Make the timeout something like this... 
$id = $widget->after(3000, sub { 
    $widget->destroy; 
}); 

# To cancel, just do... 
$id->cancel; 

Вам также необходимо убедиться, что вы не блокируете, когда виджет вынужден уходить, конечно. Это также предотвращает проблемы, если кто-то убивает виджет другими средствами, так что это двойной бонус.