使用Curses开发工具包(Cdk)时打印原始数据

时间:2010-08-23 10:00:25

标签: perl console widget ncurses

我的perl程序需要在ncurses和原始控制台之间跳转,因为它在循环中执行系统调用,就像这样(为了解决问题而简化):

  1. init Cdk
  2. 目前的菜单
  3. deinit Cdk
  4. 运行系统调用
  5. 不幸的是,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
    

2 个答案:

答案 0 :(得分: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月发布的,而不是像上个世纪发布的1998年发布的那样......

答案 1 :(得分:0)

好吧,我得到了我想要的东西,为Curses :: UI删除了Cdk 。感谢mfontani发布答案!

以下是我使用Curses::UICurses::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;