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

在perl中弹出,暂停后自动消失,perl,tk,Perl,Tk,我正在写一个脚本来帮助那些扫描条形码并得到回复的人保存或处理扫描的样本。我想要一条消息,类似于tk的messagebox或Win32::MsgBox,但它不需要用户交互就可以在三秒后消失。我的想法是在子进程中创建消息,使用报警来在延迟后终止进程。在传统知识中: sub tmpMsgBox { my ($message,$delay) = @_; if (fork() == 0) { my $topWin = MainWindow->new;

我正在写一个脚本来帮助那些扫描条形码并得到回复的人保存或处理扫描的样本。我想要一条消息,类似于tk的messagebox或Win32::MsgBox,但它不需要用户交互就可以在三秒后消失。

我的想法是在子进程中创建消息,使用
报警来在延迟后终止进程。在传统知识中:

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
,这个想法可能不会很好地发挥作用。

我的想法是在子进程中创建消息,使用
报警
在延迟后终止进程。在传统知识中:

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
,这个想法可能不会很好地发挥作用。

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

perl -MDesktop::Notify -e'
    Desktop::Notify
        ->new
        ->create(
             body => q{why hello there},
             timeout => 3000
        )->show'
是桌面被动通知弹出窗口的标准兼容界面

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

你想做的是在超时后向窗口发送一条销毁消息(如果用户选择了什么,记得取消消息的发送!)Tk当然能够做到这一点

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

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

当然,您还需要确保当小部件被迫离开时不会阻塞。如果有人也通过其他方式杀死了小部件,这也可以避免麻烦,因此这是一个双重奖励。

你想做的是在超时后向窗口发送一条销毁消息(记住,如果用户选择了什么,就取消发送消息!)Tk当然可以做到这一点

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

# To cancel, just do...
$id->cancel;
当然,您还需要确保当小部件被迫离开时不会阻塞。如果有人也通过其他方式杀死了小部件,这也可以避免麻烦,所以这是一个双倍的奖励