0

我的 perl 程序需要在 ncurses 和原始控制台之间跳转,因为它在循环中执行系统调用,如下所示(为强调问题而简化):

  1. 初始化CDK
  2. 当前菜单
  3. deinit Cdk
  4. 运行系统调用

不幸的是,Cdk 似乎use Cdk导入时初始化 ncurses 而不是实例化()Cdk::init(),所以我不知道如何禁用它。这种行为对我来说似乎完全荒谬。除了上面描述的循环之外,我的程序还有一个初始化数据库的特殊模式——这部分不提供任何类型的菜单(只有原始控制台输出),但看起来我现在必须用菜单格式化我的所有输出- 虽然甚至不使用菜单!再一次,现在只是打印程序帮助输出似乎需要我生成一个 Cdk 小部件 - 太疯狂了。

有没有办法在使用 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::UI废弃 Cdk。感谢 mfontani 发布答案!

这是我的示例解决方案,它使用Curses::UIand 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 回答
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 回答