2010-08-23 8 views
0

내 펄 프로그램은 (문제 강조 간체)과 같은 루프에서 시스템 호출, 실행으로 ncurses를하고 원시 콘솔 사이를 이동해야하는 사용하는 경우 :인쇄 원시 데이터를 저주 개발 키트 (CDK)

  1. 초기화는 Cdk
  2. 현재 메뉴
  3. deinit CDK
  4. 실행 시스템 호출은

불행하게도 CDK가 나타납니다 에서 초기화하고 use Cdk을 가져오고 인스턴스화하지 않음 (Cdk::init()) 그래서이를 비활성화하는 방법을 모르겠습니다. 이 행동은 나에게 완전히 불합리한 것처럼 보입니다. 위에서 설명한 루프와는 별도로, 나의 프로그램은 또한 데이터베이스가 초기화되는 특별한 모드를 가지고있다 -이 파트는 어떤 종류의 메뉴 (원시 콘솔 출력 만)를 나타내지는 않지만, 이제는 모든 출력을 메뉴로 포맷해야하는 것처럼 보일 것이다. - 메뉴를 사용하지 않는 동안! 그리고 다시 프로그램 도움말 출력을 인쇄하면 현재 Cdk 위젯을 생성해야합니다 - 미친.

Cdk을 사용하거나 ncrewed를 사용하면 쉽게 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

:

여기 Curses::UICurses::UI::Listbox를 사용하여 내 예 솔루션입니다 다중 항목 메뉴 목록 (나는 Cdk, Curses :: Widget :: Menu, Curses :: UI :: ListBox 및 UDMP를 시도했습니다 - 그들은 모두 절대적으로 끔찍합니다.) 그런 다음 주저하지 말고 몇 가지 힌트를 제공하십시오. – gamen

답변

0

글쎄, 내가 원하는 것을 얻었습니다. Cdk를 폐지했습니다 Curses :: UI 용. 답을 게시 해 주신 mfontani에게 감사드립니다! 나는 아주 절망적지고있어 같은 사람이 스크롤을 생성 * ANY * 기능 콘솔 기반 위젯 라이브러리를 제공 할 수 있다면,하는 (!) 참고로

#!/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 월에 발표되었지만 지난 세기에 Cdk (1998 년 출시)와 같은 것은 아닙니다 ...

+0

물론 Curses를 사용할 수는 있습니다. 그러나 이것은 내가 원하는 메뉴 위젯을주지 않는다. Curses :: UI :: Listbox (Curses :: UI)에는 콜백 함수와 함께 curses를 종료하는 간단한 방법이 있지만 콜백이 목록 요소에 액세스하자 마자 종료되기 시작합니다. perldebug는 cbreak-mode에서 많은 통찰력을 제공하지 못합니다. – gamen

+0

나는 그와 관련된 다른 질문을하고 그 문제를 일으키는 정확한 코드를 보여줄 것을 제안합니다! – mfontani

+0

나는 그것을 해결하고 내 원래의 질문에 대한 답변으로 게시했습니다. 나는 이것이 바로 여기에 올바른 행동인지는 모르겠다./어쩌면 내가 한 일을 명확히하기 위해 내 질문의 제목을 바꾸어야 할 것이다. – gamen

관련 문제