windows - sintaxis - ¿Cómo puedo mostrar la salida de la consola Perl en una GUI?
sintaxis de perl (5)
Desde una búsqueda rápida, tiene algunas opciones:
- Perl con NCurses (es una GUI, pero lo mantiene en la consola)
- Perl con wxWindows wxPerl
- PerlTK
- GTK con Perl (ver la referencia de wikibooks)
Además, hay una referencia de wikibooks para esto.
Tengo varios programas simples de Perl que escriben en el resultado estándar, pero esto tiene algunos problemas:
- algunos de mis usuarios tienen miedo por una consola
- mis usuarios trabajan en Windows, por lo que la salida de mi programa se muestra en una consola
cmd
, así que no puedo controlar la forma en que se muestra (colores y tamaño de terminal) y, lo que es peor, la consola no se puede redimensionar (al menos en ancho)
Para resolver estos problemas, me gustaría poder mostrar el resultado en una interfaz GUI simple como una opción. La GUI debe responder hasta que el programa finalice (debe ser posible desplazar o cambiar el tamaño de la ventana mientras se está ejecutando).
¿Qué kit de herramientas y artilugios simples puedo usar para hacer esto? (Desarrollo en Windows con ActivePerl).
Puede usar cualquier opción de GUI que desee, y luego podría usar Tie :: STDOUT para redefinir el comportamiento de print
y printf
en el manejador de archivo STDOUT para, en su lugar, volcar el resultado en el widget de su elección. Lo único es que conseguir que hable limpiamente con sus widgets a través de los paquetes anónimos puede ser complicado. Aquí hay un ejemplo corto y crudo usando 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();
}
Tenga en cuenta que la llamada a Win32::GUI::Dialog()
al final está presente para evitar que la ventana se cierre tan pronto como finalice el script.
Si tiene Firefox instalado en las máquinas, he estado trabajando en el módulo XUL::Gui
que le permite mostrar su gui de Perl usando el motor de renderizado de Firefox. Basándose en la respuesta de 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", $_;
}
};
Editar: corrigió un error con valores de retorno de varias líneas de la interfaz gráfica de usuario, el ejemplo anterior es más agradable ahora. funciona con XUL :: Gui 0.35+
Win32 :: Console :: ANSI le permite controlar colores y ubicaciones de fondo y de texto, y el tamaño y el título de la ventana de línea de comandos.
AFAIK, no permite la entrada del mouse, pero puede ser suficiente si solo está mostrando el progreso del programa.
Otra posibilidad es volver a escribir el programa en html / javascript y tener capacidad interactiva completa.
A menudo hago mi trabajo pesado en perl, luego construyo y escribo un programa html para la interacción del usuario.
O tenga un programa html estándar y deje que el perl escriba un archivo json con los datos específicos antes de invocar el programa html.