Perl/Curses事件处理和输入/输出

4

所以,我刚开始尝试使用perl curses模块来开展我的项目。文档似乎非常缺乏,我在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();

我已经把UI设置得我想要的样子,但是使它工作起来却很有问题。
1). 当文本输入到$mainEntry小部件中时,我想要能够检测到按下Enter/Return键,并执行一个子例程以处理输入到小部件中的文本,然后清除它。(我试过使用entryUpdate子程序来完成这个功能,但无论我如何尝试都无法使其工作。)
2). 我想要能够定期(比如每1秒或500毫秒)执行另一个子例程,并将其返回的字符串添加到$mainView小部件中。
至今为止,让其中任何一个或两个都正常工作都是一个巨大的问题,我只是不知道足够关于curses如何工作的知识,而且我在任何地方都找不到所需要的信息。任何帮助都将不胜感激。
1个回答

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);

2) 看起来有计时器方法(在 Curses-UI 源代码中通过 grepping 找到),但它们没有被记录,这可能是一个 问题。以下是它的使用方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接