Imprimer les données brutes lors de l'utilisation du kit de développement Curses (CDK)
Question
Mes perl besoins du programme pour sauter entre ncurses et une console brute car il exécute un appel système dans une boucle, comme celui-ci (simplifiée pour l'accent problème):
- CDK
- Menu présente
- deinit CDK
- appel système lancer
Malheureusement CDK semble initialiser ncurses à l'importation use Cdk
et non instanciation
(Cdk::init()
) et donc je ne sais pas comment le désactiver. Ce comportement me paraît tout à fait absurde; en dehors de la boucle décrite ci-dessus, mon programme a également un mode spécial où une base de données est initialisé - cette partie ne présente aucun type de menu (uniquement de sortie de la console brute) mais il semble que je dois maintenant formater toutes mes sorties avec des menus - tout en même pas en utilisant un menu! Et encore une fois, juste pour imprimer la sortie d'aide du programme semble maintenant me demander de générer un widget CDK -. Fou
Est-il possible de sauter facilement dans et hors de ncurses lors de l'utilisation CDK ou suis-je foiré?
Quelques exemples de code:
#!/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
La solution 2
Eh bien, je me suis ce que je voulais, déchirage CDK pour Curses :: UI. Merci mfontani pour l'affichage d'une réponse!
Voici mon exemple une solution qui utilise Curses::UI
et 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;
Autres conseils
Les éléments suivants (qui utilise la plus récente Curses le module ) semble faire ce que vous voulez : bits de Imprécations, et des bits de non-Imprécations entremêlées:
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";
Au moins ce module a été libéré ce Janvier et non (comme CDK, sorti 1998) siècle dernier ...