Perl/Curses 事件处理和 I/O

tip*_*120 4 curses terminal perl input ncurses

因此,我刚刚开始尝试在我正在进行的项目中使用 perlcurses 模块。文档似乎极其缺乏,我在 cpan 上能找到的很少的东西似乎是半成品,并且假设以前有curses库的经验,而我没有。到目前为止,我有两个问题正在尝试解决:

#!/usr/bin/perl

use strict;
use Curses::UI;
use Term::ReadKey;

my ($cols, $rows, $wp, $hp) = GetTerminalSize();

my $cui = new Curses::UI( -color_support => 1);

sub eDialog {
    my $return = $cui->dialog(
        -message    => "Are you sure?",
        -title      => "Really quit?",
        -buttons    => ['yes', 'no']
        );
    exit(0) if $return;
}

sub entryUpdate {
    my $mainentry = shift;
    if($mainEntry->get() =~ m/.*\n$/)
    {
        print STDERR $mainEntry->get();
    }
}

$cui->set_binding( \&eDialog , "\cQ");

my $mainWin = $cui->add(
    'viewWin', 'Window',
    -border => 1,
    -height => ($rows - 3),
    -bfg    => 'green'
    );

my $mainView = $mainWin->add(
    "viewWid", "TextViewer",
    -wrapping => 1
    );


my $entryWin = $cui->add(
    'entryWin', 'Window',
    -border => 1,
    -y      => ($rows - 3),
    -height => 1,
    -bfg    => 1
    );

my $mainEntry = $entryWin->add(
    "entryWid", "TextEntry",
    -onchange => \&entryUpdate()
    );

$mainEntry->focus();
$cui->mainloop();
Run Code Online (Sandbox Code Playgroud)

我设法按照我想要的方式设置 UI,但实际上让它工作却被证明是有问题的。

1)。我希望能够在 $mainEntry 小部件中输入文本时,检测何时按下 Enter/Return,并执行一个子例程来处理输入到小部件中的文本,然后将其清除。(我尝试使用 EntryUpdate 子例程来完成此操作,但无论我如何尝试,这根本不起作用。)

2)。我希望能够定期(例如,每 1 秒或 500 毫秒)执行另一个子例程,并将其返回的字符串添加到 $mainView 小部件中。

到目前为止,让其中一个或两个发挥作用已被证明是一个巨大的问题,我只是对诅咒的工作原理了解不够,而且我无法在任何地方找到我需要的信息。任何帮助将非常感激。

Sla*_*zic 5

1)您可以简单地将返回键绑定到子路由,使用set_binding

use Curses qw(KEY_ENTER);
$mainEntry->set_binding(sub {
    $mainView->text($mainView->text . $mainEntry->get . "\n");
    $mainView->draw;
    $mainEntry->text("");
}, KEY_ENTER);
Run Code Online (Sandbox Code Playgroud)

2)似乎有计时器方法(通过grep Curses-UI源代码找到它们),但它们没有记录,这可能是一个问题。它的使用方法如下:

$cui->set_timer('timer_name', sub {
    $mainView->text($mainView->text . scalar(localtime)."\n");
    $mainView->draw;
}, 1);
Run Code Online (Sandbox Code Playgroud)