/ / Perl / Cursesイベント処理とI / O-perl、input、terminal、ncurses、curses

Perl / Cursesのイベント処理とI / O - perl、input、terminal、ncurses、curses

だから、私はperlの呪いを使おうとし始めました私が取り組んでいるプロジェクトのモジュール。ドキュメントが非常に不足しているようです。cpanで見つけることができるものはほとんど完成していないようで、以前のcursesライブラリの経験を前提としています。私が解決しようとしている2つの問題があります。これまでのコードです。

#!/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ウィジェットに追加できるようにしたいです。

これらのいずれかまたは両方を機能させるには、これまでのところ大きな問題であることが証明されていますが、呪いがどのように機能するかについて十分に理解しておらず、必要な情報をどこにも見つけることができませんでした。助けていただければ幸いです。

回答:

回答№1は4

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ソースコードをgrepして見つけました)が、文書化されていません。おそらく、 問題。使用方法は次のとおりです。

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