2009-06-18 11 views
5

Mi piacerebbe creare una semplice GUI di Windows per il mio programma Perl. Fondamentalmente ha bisogno di generare una finestra, scrivere le informazioni del registro in una casella di testo e avere una casella di input e un paio di pulsanti di avvio/arresto.Perl modulo/i per la creazione di una semplice GUI di Microsoft Windows?

Qualcuno ha qualche consiglio su quali moduli Perl utilizzo? Le persone con cui lavoro sono Qt, quindi potrebbe essere una preferenza, ma non mi preoccupo.

risposta

0

uso Perl/Tk

4

Perl 5.10 da ActiveState sono pre-compilato con TKX che è una piattaforma Gui. Puoi scaricare Perl Tk se desideri un modulo con più esempi web. Qualunque modulo tu usi, puoi scaricare GUIbuilder da sourceforge e scrive codice Tk o Tkx piuttosto buono per perl, e codice Tk per python, ruby.

Questo codice è stato in gran parte generata da GuiBuilder come un esempio di codice di uscita:

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

"nostro" è ammortizzato ... hmmm –

+0

scusate per quello, ma è stato generato il codice. trovare e sostituire "il nostro" per "il mio" sembra però una soluzione abbastanza semplice. – Akers

+4

Ape-inago: "nostro" non è deprecato. Solo se usi perl 5.5.4, avvertirà che è una parola chiave futura. –

7

ho fatto uso Win32::GUI una volta per un semplice progetto così. La finestra principale aveva un menu, una casella di testo e alcuni pulsanti e caselle di controllo. Ha funzionato.

Estratto dal metodo che imposta la GUI (tanto per dare un'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

Hai diverse scelte:

Ho un debole per Gtk2. È facilmente installabile in MS Windows tramite il programma di installazione CamelBox.

Un semplice "ciao mondo" applicazione stile assomiglia

#!/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

Si prega di non Wx, tale ciclo di eventi è piuttosto limitato. e il QT a cui ti sei collegato è il binding Qt2 molto datato (non ci sono interfacce Qt3 e Qt4 terribilmente raffinate). – MkV

+0

Non dimenticare Prima. http://www.prima.eu.org/ - È una libreria gui nativa Perl piuttosto carina. – daotoad

+0

james2vegas Ho aggiornato il collegamento Qt per puntare a QtGui che afferma di essere un modulo basato su Qt4.Non mi piace Wx, ma è ancora un'opzione. –

0

L'unico che ho utilizzato è Perl Tk. È stato rapido da imparare, ci sono molti esempi sul web e sono stato in grado di effettuare rapidamente il porting da Mac OS X a Windows.

Il lato negativo è che la GUI sembra datata. È ottimo per gli strumenti interni, ma non per la vendita a terzi.

Problemi correlati