J'ai plusieurs programmes PERL simples écrivant à la sortie standard, mais cela a quelques problèmes: P>
cmd code>, donc je ne peux donc pas contrôler la manière dont il est affiché (couleurs et taille du terminal), et pire, la console n'est pas redimensionnable (au moins en largeur) li>
ul>
Pour résoudre ces problèmes, j'aimerais pouvoir afficher la sortie dans une simple interface d'interface graphique. L'interface graphique devrait être réactive jusqu'à la fin du programme (il devrait être possible de faire défiler ou de redimensionner la fenêtre pendant son fonctionnement). P>
Quelle simple boîte à outils et widget puis-je utiliser pour faire cela? (Je développe sur Windows avec ActiveperL). P>
5 Réponses :
Dans une recherche rapide, vous avez quelques options: p>
En outre, il y a un Référence Wikibooks pour cela. P>
Perl avec des ncurses ne résout pas mon problème, et avec Wxperl, Perltk ou GTK, comment rediriger ma sortie de console?
Vous devriez créer une manière standardisée de communiquer avec une application GUI qui exécute l'application de la console et envoie en entrée. Ou vous pouvez réécrire l'application.
Il n'y a pas de norme partagée pour la sortie de la console, il n'ya donc aucun processus magique pour convertir automatiquement une application de console à une application basée sur une interface graphique.
wxwidgets code>
en utilisant wx code>
le module CPAN est populaire à Perl World en ce moment (voir Padre code>
) p>
Cependant, je ne suis pas sûr que cela vienne avec ActivePerl, que je crois peut venir avec tk code>
à la place. p>
/ i3az / p>
À partir de 5.10 ActivePerl est livré avec TKX au lieu de TK, bien que TK soit toujours disponible via ppm. (TKX est un ensemble alternatif de liaisons à TCL / TK.)
@Jazz - au lieu de jouer avec STDOUT, vous pouvez envisager une option de file d'attente de message / journalisation? Pour par exemple. Quelque chose comme Message :: pile ( Search.cpan.org/dist/message-stack).
Je pourrais utiliser Cravate :: stdout ou message :: pile, ce n'est pas vraiment un problème. Mon problème restant est de savoir comment je peux avoir une interface graphique réactive affichant la sortie lorsque le programme fonctionne.
Vous pouvez utiliser n'importe quelle option d'interface graphique que vous aimez, puis vous pouvez utiliser Cravate :: stdout pour redéfinir le comportement de Imprimer code> et
printf code> à la tige de fichiers STDOUT sur Dump Sortie dans le widget de votre choix. La seule chose est que l'obtention de parler à vos widgets sur des packages proprement à l'aide du sous-fonctionnement anonyme pourrait être en désordre. Voici un exemple court et brut en utilisant 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();
}
C'est un bon début. Un problème reste: 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: Ouais, vous pouvez en fait utiliser Fork () code>, l'émulation de Windows Fork le gérera pour vous. J'ai édité ma réponse pour montrer le changement.
Si vous avez Firefox installé sur les machines, je travaille sur le module XUL :: GUI CODE> qui vous permet d'afficher votre GUI Perl à l'aide du moteur de rendu de Firefox. Bâtiment 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", $_;
}
};
Juste regarder le code, je m'attendais à `. = Joindre ($ , @_). $ \ `, mais je n'ai pas joué avec ça pour voir.
win32 :: console :: ANSI vous permet de contrôler les couleurs et les emplacements de fond et de texte, ainsi que la taille et le titre de la fenêtre de la ligne de commande. P>
afaik, il n'autorise pas l'entrée de la souris, mais cela peut suffire si vous affichez simplement des progrès du programme. P>
Une autre possibilité est de réécrire le programme en HTML / JavaScript et d'avoir une capacité interactive complète. P>
Je fais souvent mon poids lourd à Perl, puis construisez et écrivez un programme HTML pour l'interaction utilisateur. p>
ou avoir un programme HTML standard et laissez le Perl écrire un fichier JSON avec les données spécifiques avant d'appeler le programme HTML. P>