Печать необработанных данных при использовании комплекта разработки Curses (Cdk) - PullRequest
0 голосов
/ 23 августа 2010

Моей perl-программе необходимо переключаться между ncurses и необработанной консолью, поскольку она выполняет системный вызов в цикле, например так (упрощено для выделения проблем):

  1. init Cdk
  2. настоящее меню
  3. deinit Cdk
  4. запустить системный вызов

К сожалению, Cdk, по-видимому, инициализирует ncurses при импорте use Cdk, а не его создании (Cdk::init()) и поэтому я не знаю, как это отключить. Такое поведение кажется мне совершенно абсурдным; кроме описанного выше цикла, моя программа также имеет специальный режим, в котором инициализируется база данных - эта часть не представляет никакого меню (только необработанный вывод на консоль), но все же может показаться, что теперь мне нужно отформатировать весь вывод с помощью меню - хотя даже не используя меню! И снова, просто для того, чтобы распечатать вывод справки программы, теперь, похоже, мне нужно сгенерировать виджет Cdk - безумие.

Есть ли способ легко прыгать и выходить из ncurses при использовании Cdk или я ввернут?

Пример кода:

#!/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 голосов
/ 23 августа 2010

Ну, я получил то, что хотел, утилизацию Cdk для Curses :: UI. Спасибо 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;
0 голосов
/ 23 августа 2010

Следующее (которое использует более новый модуль Curses ), кажется, делает то, что вы хотите: биты Curses и биты Non-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";

По крайней мере этомодуль был выпущен в январе этого года, а не (как Cdk, выпущенный в 1998 году) в прошлом веке ...

...