我的perl程序需要在ncurses和原始控制台之间跳转,因为它在循环中执行系统调用,就像这样(为了解决问题而简化):
不幸的是,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
答案 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::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;