0

私のperlプログラムは、次のようにループでシステムコールを実行するため、ncursesとrawコンソールの間をジャンプする必要があります(問題を強調するために簡略化されています)。

  1. init Cdk
  2. 現在のメニュー
  3. Cdkをdeinit
  4. システムコールを実行する

残念ながら、Cdkはインスタンス化ではなくインポートにncursesを初期化するように見えるので( )、それを無効にする方法がわかりません。この振る舞いは私には完全にばかげているようです。上記のループとは別に、私のプログラムにはデータベースが初期化される特別なモードもあります-この部分はどのような種類のメニューも表示しません(生のコンソール出力のみ)が、今ではすべての出力をメニューでフォーマットする必要があるようです-メニューも使わないうちに!繰り返しになりますが、プログラムのヘルプ出力を印刷するだけで、Cdkウィジェットを生成する必要があるようです-非常識です。use CdkCdk::init()

Cdkを使用しているときにncursesに簡単に出入りする方法はありますか、それとも私はねじ込まれていますか?

いくつかのサンプルコード:

#!/usr/bin/perl

use Cdk;

eval {popupLabel(["popup before init"]);}; # will fail as init() isn't called
print "Test after use\n";                  # won't be printed (which is a problem!)
Cdk::init();
print "Test after init\n";                 # won't be printed
popupLabel(["popup after init"]);
Cdk::end();
print "Test after end\n";                  # won't be printed
4

2 に答える 2

0

以下(新しいCursesモジュールを使用)はあなたが望むことをしているようです:CursesのビットとCurses以外のビットが混ざっています:

use strict;
use warnings;
use Curses;

# Non-Curses
print "Press a key...\n";
<STDIN>;

# Curses
initscr();
addstr(14, 0, "hit a key: ");
refresh();
my $ch = getch();
endwin();

# Non-Curses
print "Hi again, press a key...\n";
<STDIN>;

# Curses again
initscr();
addstr(14, 0, "hit another key: ");
refresh();
my $ch2 = getch();
endwin();

# Non-Curses
print "bye!\n";

少なくともこのモジュールは今年1月にリリースされ、前世紀にはリリースされませんでした(Cdkのように1998年にリリースされました)...

于 2010-08-23T12:25:17.303 に答える
0

さて、私はCurses :: UIのCdkを廃棄して、欲しいものを手に入れました。回答を投稿してくれたmfontaniに感謝します!

Curses::UIこれがとを使用する私のサンプルソリューションCurses::UI::Listboxです:

#!/usr/bin/perl

use Curses::UI;
use Curses::UI::Listbox;

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

my $win = $cui->add('window_id', 'Window');

sub user_select {
    my ($cui, $obj) = @_;

    my $item = $obj->get_active_value();

    $cui->leave_curses();

    print "You selected $item!\n";
    sleep(1);
}

my $listbox = $win->add(
            'mylistbox', 'Listbox',
            -onchange    => sub{ user_select($cui, @_) },
            -border      => 1,
            -values      => [1, 2, 3],
            -labels      => { 1 => 'One', 
                      2 => 'Two', 
                      3 => 'Three' },
    );
$listbox->focus();
$cui->mainloop;
于 2010-08-23T13:29:01.560 に答える