2009-06-18 14 views
5

Me gustaría crear una GUI sencilla de Windows para mi programa Perl. Básicamente necesita generar una ventana, escribir información de registro en un cuadro de texto y tener un cuadro de entrada y un par de botones de inicio/detención.Módulo (s) de Perl para crear una interfaz gráfica de usuario simple de Microsoft Windows?

¿Alguien tiene alguna sugerencia sobre qué módulos de Perl uso? Las personas con las que trabajo, como Qt, pueden ser una preferencia, pero no me molesta.

Respuesta

4

Perl 5.10 de ActiveState vienen pre-compilado con Tkx que es una plataforma Gui. Puede descargar Perl Tk si desea un módulo con más ejemplos web. Cualquiera que sea el módulo que use, puede descargar GUIbuilder de sourceforge y escribe bastante bien el código Tk o Tkx para perl, y el código Tk para python, ruby.

Este código se ha generado en gran medida por GUIBuilder como un ejemplo de código de salida:

use Tkx; 
Tkx::package_require('BWidget'); 

sub example::ui { 
    my($root) = @_; 

    my($_entry_box) = $root->new_entry(
    -width => 0, 
    ); 
    my($_text_box) = $root->new_text(
     -height => 0, 
     -width => 0, 
    ); 
    my($_label) = $root->new_label(
      -text => "Hello World", 
    ); 
    my($_textbox_horiz_scrollbar) = $root->new_scrollbar(
      -orient => "horizontal", 
    ); 
    my($_textbox_vert_scrollbar) = $root->new_scrollbar(
    ); 
    my($_Start_Button) = $root->new_Button(
      -text => "Start", 
      -width => 10, 
    ); 
    my($_Stop_Button) = $root->new_Button(
      -text => "Stop", 
      -width => 10, 
    ); 

    $_entry_box->configure(
      -invalidcommand => \&_entry_box_invalidcommand 
    ); 
    $_entry_box->configure(
      -validatecommand => \&_entry_box_validatecommand 
    ); 
    $_entry_box->configure(
      -xscrollcommand => \&_entry_box_xscrollcommand 
    ); 
    $_text_box->configure(
      -xscrollcommand => [ $_textbox_horiz_scrollbar => set ] 
    ); 
    $_text_box->configure(
      -yscrollcommand => [ $_textbox_vert_scrollbar => set ] 
    ); 
    $_textbox_horiz_scrollbar->configure(
      -command => [ $_text_box => xview ] 
    ); 
    $_textbox_vert_scrollbar->configure(
      -command => [ $_text_box => yview ] 
    ); 
    $_Start_Button->configure(
      -armcommand => \&_Start_Button_armcommand 
    ); 
    $_Start_Button->configure(
      -command => \&_Start_Button_command 
    ); 
    $_Start_Button->configure(
      -disarmcommand => \&_Start_Button_disarmcommand 
    ); 
    $_Stop_Button->configure(
      -armcommand => \&_Stop_Button_armcommand 
    ); 
    $_Stop_Button->configure(
      -command => \&_Stop_Button_command 
    ); 
    $_Stop_Button->configure(
      -disarmcommand => \&_Stop_Button_disarmcommand 
    ); 
    sub _entry_box_xscrollcommand {} 

# Geometry Management 
    $_entry_box->g_grid(
      -in  => $root, 
      -column => 1, 
      -row => 2, 
      -columnspan => 3, 
      -ipadx => 0, 
      -ipady => 0, 
      -padx => 0, 
      -pady => 5, 
      -rowspan => 1, 
      -sticky => "ew" 
    ); 
    $_text_box->g_grid(
      -in  => $root, 
      -column => 1, 
      -row => 3, 
      -columnspan => 2, 
      -ipadx => 0, 
      -ipady => 0, 
      -padx => 0, 
      -pady => 0, 
      -rowspan => 1, 
      -sticky => "news" 
    ); 
    $_label->g_grid(
      -in  => $root, 
      -column => 1, 
      -row => 1, 
      -columnspan => 3, 
      -ipadx => 0, 
      -ipady => 0, 
      -padx => 0, 
      -pady => 0, 
      -rowspan => 1, 
      -sticky => "ew" 
    ); 
    $_textbox_horiz_scrollbar->g_grid(
      -in  => $root, 
      -column => 1, 
      -row => 4, 
      -columnspan => 2, 
      -ipadx => 0, 
      -ipady => 0, 
      -padx => 0, 
      -pady => 0, 
      -rowspan => 1, 
      -sticky => "ew" 
    ); 
    $_textbox_vert_scrollbar->g_grid(
      -in  => $root, 
      -column => 3, 
      -row => 3, 
      -columnspan => 1, 
      -ipadx => 0, 
      -ipady => 0, 
      -padx => 0, 
      -pady => 0, 
      -rowspan => 1, 
      -sticky => "ns" 
    ); 
    $_Start_Button->g_grid(
      -in  => $root, 
      -column => 1, 
      -row => 5, 
      -columnspan => 1, 
      -ipadx => 0, 
      -ipady => 0, 
      -padx => 0, 
      -pady => 0, 
      -rowspan => 1, 
      -sticky => "" 
    ); 
    $_Stop_Button->g_grid(
      -in  => $root, 
      -column => 2, 
      -row => 5, 
      -columnspan => 2, 
      -ipadx => 0, 
      -ipady => 0, 
      -padx => 0, 
      -pady => 0, 
      -rowspan => 1, 
      -sticky => "" 
    ); 


# Resize Behavior 
    $root->g_grid_rowconfigure(1, -weight => 0, -minsize => 2, -pad => 0); 
    $root->g_grid_rowconfigure(2, -weight => 0, -minsize => 12, -pad => 0); 
    $root->g_grid_rowconfigure(3, -weight => 1, -minsize => 85, -pad => 0); 
    $root->g_grid_rowconfigure(4, -weight => 0, -minsize => 4, -pad => 0); 
    $root->g_grid_rowconfigure(5, -weight => 0, -minsize => 40, -pad => 0); 
    $root->g_grid_columnconfigure(1, -weight => 1, -minsize => 67, -pad => 0); 
    $root->g_grid_columnconfigure(2, -weight => 1, -minsize => 186, -pad => 0); 
    $root->g_grid_columnconfigure(3, -weight => 0, -minsize => 2, -pad => 0); 
} 

my($root) = Tkx::widget->new('.'); 
$root->g_wm_title('stackoverflow'); 
example::ui($root); 

Tkx::MainLoop(); 

1; 
+0

"nuestro" se ha depreciado ... hmmm –

+0

Disculpe, pero se generó código. Sin embargo, encontrar y reemplazar "nuestro" para "mi" parece una solución bastante fácil. – Akers

+4

Ape-inago: "our" no está en desuso. Solo si usa perl 5.5.4, advertirá que es una palabra clave futura. –

7

Hice uso Win32::GUI una vez para un proyecto tan simple. La ventana principal tenía un menú, un cuadro de texto y algunos botones y casillas de verificación. Funcionó.

Extracto del método que configura la interfaz gráfica de usuario (sólo para darle una idea):

my @menu_items = (
    '&File' => 'File', 
    ' > &Open' => { 
     -name => 'FileOpen', 
     -onClick => sub { $self->onFileOpen(@_) }, 
    }, 
    ' > &Close' => { 
     -name => 'FileClose', 
     -onClick => sub { $self->onFileClose(@_) }, 
    }, 
    ' > E&xit' => { 
     -name => 'FileExit', 
     -onClick => sub { $self->onFileExit(@_) }, 
    }, 
    '&Help' => 'Help', 
    ' > &About' => { 
     -name => 'About', 
     -onClick => sub { $self->onHelpAbout(@_) }, 
    }, 
); 

$self->set_main_menu(Win32::GUI::MakeMenu(@menu_items)); 

my $window = $self->set_main_window(
    Win32::GUI::Window->new(
     -menu => $self->get_main_menu, 
     -name => 'Main', 
     -sizable => 0, 
     -resizable => 0, 
     -hasmaximize => 0, 
     -maximizebox => 0, 
     -title => $self->get_program_name, 
     -onTerminate => sub { -1 }, 
     -onTimer => sub { $self->onTimer(@_) }, 
    ), 
); 

$self->set_log_field(
    $window->AddTextfield(
     -name => 'Log', 
     -font => Win32::GUI::Font->new(
      -name => 'LogFont', 
      -face => 'Courier New', 
      -size => 9, 
     ), 
     -multiline => 1, 
     -wantreturn => 1, 
     -autovscroll => 1, 
     -vscroll => 1, 
     -readonly => 1, 
    ), 
); 

$self->get_log_field->MaxLength(40000); 

$self->set_status_bar(
    $window->AddStatusBar(
     -name => 'Status', 
     -text => $self->get_program_name, 
    ), 
); 
6

Usted tiene varias opciones:

Soy parcial Gtk2. Se instala fácilmente en MS Windows a través del instalador CamelBox.

Un "hola mundo" aplicación estilo sencillo parece

#!/usr/bin/perl 

use strict; 
use warnings; 

use Gtk2; 

Gtk2->init; 

my $window = Gtk2::Window->new; 
my $vbox = Gtk2::VBox->new; 
my $label = Gtk2::Label->new("Hello World"); 
my $button = Gtk2::Button->new("Press me"); 

$window->add($vbox); 
$vbox->add($label); 
$vbox->add($button); 

my $i; 
$button->signal_connect(clicked => sub { 
    $label->set_text("button pressed " . ++$i . " times"); 
}); 

$window->signal_connect(destroy => sub { Gtk2->main_quit }); 

$window->show_all; 

Gtk2->main; 
+0

Por favor, no Wx, ese ciclo de eventos es bastante limitado. y el QT al que se ha vinculado es el de las uniones Qt2 muy desactualizadas (no hay interfaces Qt3 y Qt4 muy pulidas). – MkV

+0

No te olvides de Prima. http://www.prima.eu.org/ - Es una bonita biblioteca de gui nativa de Perl. – daotoad

+0

james2vegas He actualizado el enlace Qt para que apunte a QtGui que dice ser un módulo basado en Qt4.No me gusta Wx también, pero todavía es una opción. –

0

El único que he utilizado es Perl Tk. Fue rápido para aprender, hay muchos ejemplos en la web y pude hacer un puerto desde Mac OS X a Windows rápidamente.

El inconveniente es que la GUI parece anticuada. Es ideal para herramientas internas, pero no para vender a terceros.

Cuestiones relacionadas