Imprimer les données brutes lors de l'utilisation du kit de développement Curses (CDK)

StackOverflow https://stackoverflow.com/questions/3546481

  •  30-09-2019
  •  | 
  •  

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):

  1. CDK
  2. Menu présente
  3. deinit CDK
  4. 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
Était-ce utile?

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 ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top