在perl中弹出,在暂停后自动消失

时间:2012-03-08 16:19:16

标签: perl tk

我正在编写一个脚本来帮助那些扫描条形码并获得保留或处理扫描样本的响应的人。我希望有一条消息,类似于tk的messagebox或Win32 :: MsgBox,但三秒后不需要用户交互就消失了。

3 个答案:

答案 0 :(得分: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", $_);
}

我不认为Tk可以与fork很好地配合,所以如果你在主过程中也使用Tk,这个想法可能不会很好。< / p>

答案 1 :(得分:1)

Desktop::Notify是桌面被动通知弹出窗口的标准兼容界面。

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

答案 2 :(得分:0)

你要做的是在超时后向窗口发送一条销毁消息(如果用户确实选择了某些内容,请记住取消发送消息!)Tk肯定能够做到这一点。

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

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

当然,您还需要确保在窗口小部件被迫离开时不会阻止。如果有人通过其他方式杀死小部件,这也可以防止麻烦,所以这是一个双重奖励。

相关问题