Обзор виджетов Tk, я начну с рассмотрения главного меню c учетом особенностей различных ОС.
Для начала создадим заготовку для нашего приложения:
#!/usr/bin/perl -w
use strict;
use Tkx;
our $PROGNAME = 'app';
our $VERSION = '0.1';
<habracut>
my $windowingsystem = Tkx::tk_windowingsystem();
my $IS_AQUA = ($windowingsystem eq 'aqua');
# Учитывая, что имена некоторых кнопок могут различаться,
# в OSX это Control, в Win/X11 это Ctrl, добавим еще несколько переменных
# (пригодится для хоткеев)
my $plat_acc_ctrl = ($^O eq 'darwin') ? ('Control-') : ('Ctrl+');
my $plat_evt_ctrl = ($^O eq 'darwin') ? ('Control-') : ('Control-');
# Главное окно.
my $mw = Tkx::widget->new('.');
Tkx::tk( appname => $PROGNAME );
Tkx::wm_minsize( $mw => qw(320 200) );
# новое меню прикрепляется с помощью параметра -menu
$mw->configure(
-menu => make_menu( $mw ),
);
Tkx::MainLoop;
1;
sub on_quit {
Tkx::tk___messageBox( -message => 'Goodbye ;]' );
exit;
}
sub show_about {
Tkx::tk___messageBox( -message => "$PROGNAME $VERSION" );
}
sub make_menu {
my $mw = shift || return;
# По умолчанию, все меню выглядит подобно в GIMP, их можно открепить
# Поэтому, выключим данную опцию
Tkx::option_add('*Menu.tearOff', 0)
# ... продолжение ниже
return $m;
}
Все как обычно, File, Edit, Help. (меню каскадное). Новый объект создается с помощью метода new_menu(); (подобно контейнеру)
my $m = $mw->new_menu(); # Верхний уровень
my $fm = $m->new_menu(); # File
my $em = $m->new_menu(); # Edit
# А теперь, добавим наши пункты в верхний уровень
$m->add_cascade( -label => 'File', -menu => $fm, -underline => 0 );
$m->add_cascade( -label => 'Edit', -menu => $em, -underline => 0 );
Добавление осуществляется через add_cascade(), где
-label — это заголовок меню.
-menu — виджет
-underline — индекс буквы подчеркивания. Необходимо для быстрой навигации с помощью кнопки Alt+буква (нумерация идет с 0)
смотрим, что получилось.
Толку от пустого меню нету, поэтому «набьем» его командами
# Меню File
$fm->add_command(
-label => 'Do something',
-underline => 0,
-command => sub { },
);
# разделитель
$fm->add_separator();
$fm->add_command(
-label => 'Quit',
-underline => 0,
-accelerator => "${plat_acc_ctrl}Q",
-command => [\&on_quit],
);
Tkx::bind( all => "<${plat_evt_ctrl}q>" => [\&on_quit] );
# Меню Edit
$em->add_command(
-label => 'Cut',
-underline => 2,
-accelerator => "${plat_acc_ctrl}X",
-command => sub { Tkx::event_generate(Tkx::focus(), '<