2010-08-23 14 views
0

Mon programme Perl doit 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):imprimer des données brutes lors de l'utilisation du kit de développement Curses (CDK)

  1. initialisation Cdk
  2. Menu présente
  3. deinit CDK
  4. appel système d'exécution

Malheureusement CDK semble initialiser ncurses à l'importation use Cdk et non l'instanciation (Cdk::init()) et donc je ne sais pas comment le désactiver. Ce comportement me semble complètement absurde; en dehors de la boucle décrite ci-dessus, mon programme dispose également d'un mode spécial où une base de données est initialisée - cette partie ne présente aucun type de menu (seulement la sortie brute) mais il me semble que je dois formater toute ma sortie avec des menus - sans même utiliser un menu! Et encore, juste pour imprimer la sortie de l'aide du programme semble maintenant me demander de générer un widget Cdk - fou.

Y at-il un moyen de facilement entrer et sortir de ncurses lors de l'utilisation Cdk ou suis-je vissé?

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 
+0

En tant que sidenote, comme je reçois tout à fait désespérée, si quelqu'un pouvait fournir * TOUT * bibliothèque de widgets en mode console fonctionnelle pour générer un scrollable, liste de menu multi-éléments (j'ai essayé Cdk, Curses :: Widget :: Menu, Curses :: UI :: ListBox et UDMP - ils sont tous absolument horribles) alors s'il vous plaît n'hésitez pas à me donner quelques conseils. – gamen

Répondre

0

Eh bien, j'ai eu ce que je voulais, mise au rebut Cdk pour Curses :: UI. Merci mfontani d'avoir posté une réponse!

Voici mon exemple de solution qui utilise 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; 
0

Ce qui suit (qui utilise le plus récent Curses module) semble faire ce que vous voulez: des morceaux de Curses, et des morceaux de non-Curses entremêlés:

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é publié en janvier et non (comme Cdk, sorti en 1998) au siècle dernier ...

+0

Bien sûr, je peux utiliser Curses seul; Cependant, cela ne me donne pas le widget de menu que je voudrais. J'essaie farouchement d'obtenir Curses :: UI :: Listbox (Curses :: UI a un moyen simple de quitter les malédictions avec la méthode leave_curses) pour fonctionner avec les callbacks, mais il continue à se terminer dès que le callback accède à un élément list. perldebug ne fournit pas beaucoup d'informations en mode cbreak non plus .. – gamen

+0

Je vous suggère d'ouvrir une autre question liée à cela, et montrer le code exact qui vous donne ce problème! – mfontani

+0

Je le ferais, sauf que je l'ai résolu et posté ici comme une réponse à ma question initiale. Je ne sais pas si c'est le bon comportement ici sur SO:/je devrais peut-être changer le titre de ma question afin de clarifier ce qui a été fait. – gamen