2009-12-08 5 views
8

J'ai plusieurs simples programmes Perl écriture sur la sortie standard, mais cela a quelques problèmes:Comment afficher la sortie de la console Perl dans une interface graphique?

  • certains de mes utilisateurs sont effrayés par une console
  • mes utilisateurs travaillent sur Windows, donc ma sortie de programme est affiché sur une console cmd, donc je ne peux pas contrôler la façon dont il est affiché (couleurs et la taille du terminal), et pire encore, la console n'est pas redimensionnable (au moins en largeur)

pour résoudre ces problèmes, je voudrais être capable d'afficher la sortie dans une interface GUI simple en option. L'interface graphique doit être réactive jusqu'à ce que le programme se termine (il devrait être possible de faire défiler ou de redimensionner la fenêtre pendant son exécution).

Quelle simple boîte à outils et quel widget puis-je utiliser pour faire cela? (Je développe sur Windows avec ActivePerl).

Répondre

10

Vous pouvez utiliser une option de GUI que vous voulez, et vous pouvez utiliser Tie::STDOUT pour redéfinir le comportement des print et printf au descripteur de fichier STDOUT pour vider la place sortie dans le widget de votre choix. La seule chose est que l'obtenir pour parler proprement à vos widgets à travers les paquets en utilisant le sous-marin anonyme pourrait être désordonné. Voici un court exemple brut à l'aide Win32::GUI:

use Win32::GUI(); 
use Tie::STDOUT 
    print => sub { 
     $main::textfield->Append(@_); 
    }; 

my $main = Win32::GUI::Window->new(
     -name => 'Main', 
     -text => 'Perl', 
     -width => 220, 
     -height => 230, 
    ); 
our $textfield = $main->AddTextfield(
     -name => "Output", 
     -left => 8, 
     -top => 8, 
     -width => 180, 
     -height => 180, 
     -readonly => 1, 
     -multiline => 1, 
     -vscroll => 1, 
    ); 
$main->Show(); 
sub Main_Terminate { 
     -1; 
} 


if(!fork()) { 
    print "Hello.\n"; 
    for (1..20) { 
     sleep 1; 
     printf "More output %d\n", $_; 
    } 
} else { 
    Win32::GUI::Dialog(); 
} 

Notez l'appel à Win32::GUI::Dialog() à la fin est présent pour garder la fenêtre de fermer dès que le script est terminé.

+0

C'est un bon début. Un problème subsiste: l'interface graphique ne répond pas jusqu'à ce que le programme atteigne Win32 :: GUI :: Dialog. Peut-être que je devrais essayer d'utiliser 2 threads? – Jazz

+0

@Jazz: Oui, en fait, vous pouvez utiliser 'fork()', l'émulation de fork de Windows le gérera pour vous. J'ai édité ma réponse pour montrer le changement. –

5

A partir d'une recherche rapide vous avez quelques options:

  1. Perl with NCurses (son interface graphique, mais il garde dans la console)
  2. Perl avec wxWindows wxPerl
  3. PerlTK
  4. GTK avec Perl (voir la référence wikibooks)

De plus, il y a un wikibooks reference pour cela.

+0

Perl avec NCurses ne résout pas mon problème, et avec wxPerl, PerlTK ou GTK, comment puis-je rediriger la sortie de ma console? – Jazz

+0

Vous devez créer une façon standard de communiquer avec une application graphique qui exécute l'application console et envoie une entrée. Ou vous pouvez réécrire l'application. – monksy

+0

J'espérais que quelque chose existait déjà qui résolvait ce problème ... – Jazz

1

wxWidgets utilisant Wx module CPAN est populaire dans le monde Perl en ce moment (voir Padre)

Cependant, je ne suis pas sûr que ce ne avec ActivePerl que je crois peut venir avec Tk à la place.

/I3az/

+0

Comment cela résout-il le problème de sortie de ma console? – Jazz

+0

A partir de 5.10, ActivePerl est fourni avec Tkx au lieu de Tk, bien que Tk soit toujours disponible via PPM. (Tkx est un ensemble alternatif de liaisons à Tcl/Tk.) –

+0

@Jazz - Au lieu de jouer avec STDOUT, vous pourriez envisager une option de message/file d'attente de journalisation? Par exemple. quelque chose comme Message :: Stack (http://search.cpan.org/dist/Message-Stack/). – draegtun

4

Si vous avez installé Firefox sur les machines, j'ai travaillé sur le module XUL::Gui qui vous permet d'afficher votre interface Perl en utilisant le moteur de rendu de Firefox. S'appuyant sur la réponse d'Adam:

use XUL::Gui; 
use Tie::STDOUT 
    print => sub {$ID{text}->value .= join '' => @_}; 

display Window title=>'Perl', minwidth=>640, minheight=>480, 
    TextBox(FILL SCROLL id=>'text', multiline=>'true'), 
    delay { 
     print "hello world\n"; # Output goes to the window. 
     for (1..5) { 
      printf "More output %d\n", $_; 
     } 
    }; 

Edit: Correction d'un bug avec les valeurs de retour à plusieurs lignes de l'interface, par exemple est plus agréable maintenant au-dessus. fonctionne avec XUL :: Gui 0.35+

+0

En regardant le code, je m'attendrais ''. = Join ($ ,, @_). $ \\ ', mais je n'ai pas vraiment joué avec pour voir. – ephemient

+0

@ephemient => merci, mis à jour –

0

Win32 :: Console :: ANSI vous permet de contrôler les couleurs et les emplacements d'arrière-plan et de texte, ainsi que la taille et le titre de la fenêtre de ligne de commande.AFAIK, cela ne permet pas la saisie de la souris, mais cela peut suffire si vous affichez simplement la progression du programme.

Une autre possibilité est de réécrire le programme en html/javascript et avoir une capacité interactive complète.

Je fais souvent mes lourdes charges dans Perl, puis construis et écris un programme html pour l'interaction de l'utilisateur.

Ou avoir un programme html standard et laisser le perl écrire un fichier json avec les données spécifiques avant d'appeler le programme html.

Questions connexes