tags:

views:

800

answers:

5

I'd like to create a simple Windows GUI for my Perl program. It basically needs to spawn a window, write log information to a text box, and have an input box and a couple of start/stop buttons.

Does anyone have any tips as to which Perl modules I use? The people I work with like Qt, so that may be a preference, but I'm not bothered.

A: 

use Perl/Tk

Demi
+3  A: 

Perl 5.10 from Activestate come pre-compiled with Tkx which is a Gui Platform. You can download Perl Tk if you'd like a module with more web examples. Which ever module you use, you can download GUIbuilder from sourceforge and it writes pretty good Tk or Tkx code for perl, and Tk code for python, ruby.

This code was largely generated by GuiBuilder as an example of output code:

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;
Akers
"our" is depreciated... hmmm
Ape-inago
sorry about that, but it was generated code. find and replace "our" for "my" seems like an easy enough fix though.
Akers
Ape-inago: "our" is not deprecated. Only if you use perl 5.5.4, it will warn that it is a future keyword.
Alexandr Ciornii
To confirm Alexandr Ciornii comment, I looked up "our" on perldoc http://perldoc.perl.org/functions/our.html, and it appears depricated is not mentioned anywhere. Maybe I should have done this before but its nice to know now.
Akers
+4  A: 

I did use Win32::GUI once for such a simple project. The main window had a menu, a text-box and a few buttons and checkboxes. It worked.

Excerpt from the method that sets up the GUI (just to give you an 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,
    ),
);
Sinan Ünür
+4  A: 

You have several choices:

I am partial to Gtk2. It is easily installed in MS Windows via the CamelBox installer.

A simple "hello world" style application looks like

#!/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;
Chas. Owens
Please not Wx, that event loop is pretty limited. and the QT you linked to is the very out of date Qt2 bindings (there are not terribly polished Qt3 and Qt4 interfaces).
MkV
Don't forget Prima. http://www.prima.eu.org/ - It's a pretty slick Perl native gui library.
daotoad
james2vegas I have updated the Qt link to point to QtGui which claims to be a Qt4 based module. I dislike Wx as well, but it is still an option.
Chas. Owens
@daotoad I will have to take a look at Prima, I have never heard of it before.
Chas. Owens
A: 

The only one I have used is Perl Tk. It was quick to learn, there are many examples on the web, and I was able to port from Mac OS X to Windows quickly.

The downside is that the GUI looks dated. It is great for in-house tools, but not for selling to third parties.

Paul Chernoch