Я хотел бы создать простой Windows GUI для своей программы Perl. Это в основном должно породить окно, записать информацию о журнале в текстовое поле и иметь поле ввода и несколько запусков/кнопок остановки.
У кого-либо есть какие-либо подсказки, относительно которых модулей Perl я использую? Люди я работаю с подобным QT, так, чтобы могло быть предпочтение, но я не побеспокоен.
Я однажды использовал Win32 :: GUI для такого простого проекта. В главном окне было меню, текстовое поле и несколько кнопок и флажков. Это сработало.
Выдержка из метода настройки графического интерфейса пользователя (просто чтобы дать вам представление):
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,
),
);
Perl 5.10 от Activestate поставляется с предварительно скомпилированным Tkx, который является платформой Gui. Вы можете скачать Perl Tk, если вам нужен модуль с большим количеством веб-примеров. Какой бы модуль вы ни использовали, вы можете загрузить GUIbuilder из sourceforge, и он пишет довольно хороший код Tk или Tkx для perl и код Tk для python, ruby.
Этот код был в значительной степени сгенерирован GuiBuilder как пример выходного кода:
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;
Я использовал только Perl Tk. Это было быстро освоить, в сети есть много примеров, и я смог быстро портировать с Mac OS X на Windows.
Обратной стороной является то, что графический интерфейс выглядит устаревшим. Он отлично подходит для собственных инструментов, но не для продажи третьим лицам.
У вас есть несколько вариантов:
Я неравнодушен к Gtk2. Его легко установить в MS Windows с помощью установщика CamelBox .
Простое приложение в стиле «привет, мир» выглядит как
#!/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;