2010-08-23 54 views
0

我的Perl程序需要在執行循環中的系統調用,就像這樣(簡化問題的強調)的ncurses和原始控制檯之間跳轉時:打印原始數據使用詛咒開發工具包(CDK)

  1. 初始化Cdk
  2. 當前菜單
  3. DEINIT的Cdk
  4. 運行系統調用

不幸的Cdk出現初始化ncurses use Cdk導入,而不是實例化 (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

一點題外話,因爲我十分絕望,如果任何人都可以產生一個可滾動的提供* ANY *功能基於控制檯的部件庫,多項菜單列表(我試過Cdk,Curses :: Widget :: Menu,Curses :: UI :: ListBox和UDMP - 它們都非常可怕),那麼請不要猶豫,給我一些提示。 – gamen 2010-08-23 11:43:48

回答

0

嗯,我得到了我想要的,爲Curses :: UI報廢Cdk。感謝mfontani發表一個答案!

這裏是它採用和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; 
0

以下(使用新的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年的Cdk一樣...

+0

當然,我可以自己使用Curses;然而這並不能給我我想要的菜單部件。我正在努力獲取Curses :: UI :: Listbox(Curses :: UI有一個退出curses和leave_curses方法的簡單方法)以回調函數工作,但只要回調函數訪問列表元素,它就會一直終止。 perldebug在cbreak-mode中沒有提供太多洞察力.. – gamen 2010-08-23 12:55:58

+0

我建議你打開另一個與此相關的問題,並顯示給你這個問題的確切代碼! – mfontani 2010-08-23 15:10:00

+0

我會,除了我解決它,並在這裏發佈它作爲我原來的問題的答案。我不知道這是否是正確的行爲:/也許我應該改變我的問題的標題,以澄清所做的事情。 – gamen 2010-08-23 20:55:47