В предыдущем посте мы разобрались с библиотеками для написания GUI на Perl. Поэтому можно приступить к работе.
Сегодня мы попробуем создать простое приложение (окно и главное меню).
Я буду использовать Tkx и ActivePerl.
Для начала, необходимо понять основные принципы.
Tkx — это прослойка между языком Tcl и библиотекой Tk. Т.е все что мы пишем с использованием Tkx, на самом деле вызывается в среде Tcl.
Tcl — командный язык инструментов. Ничего сложного в нем нет, синтаксис прост:
Также в языке есть поддержка пакетов (или модулей как в Perl), вызов будет следующий
Основа Tk это виджеты. Каждый созданный виджет имеет свое имя.
Пример
. — главное окно.
.f — главный фрейм.
.f.b — кнопка на главном фрейме.
Tkx предоставляет объектно-ориентированный подход, поэтому вам ненужно беспокоиться об именах. Tkx сделает все сам. Также применяется соглашение относительно вызовов (это самое главное). Ниже будут представлены примеры.
TCL:
Perl:
TCL:
Perl:
TCL:
Perl:
Если мы хотим произвести какое-либо действие над уже созданным объектом, то можно использовать более краткую форму (используется префикс g_). К примеру, необходимо задать заголовок окна
Tcl:
Полная форма:
Краткая:
Иными словами, '::' в перл будет '__' (два подчеркивания), пробел в составных командах — одно подчеркивание '_', а нижнее подчеркивание в Tcl обозначается через 3 подчеркивания �� Perl '___';
Каждая программа должна иметь вызов основного цикла событий (MainLoop), или
Справочник по командам Tcl/Tk можно найти здесь.
А теперь рабочий пример.

Исходный код:
в следующей части рассмотрим основные виджеты, а также некоторые особенности в работе на OSX.
Сегодня мы попробуем создать простое приложение (окно и главное меню).
Я буду использовать Tkx и ActivePerl.
Для начала, необходимо понять основные принципы.
Tkx — это прослойка между языком Tcl и библиотекой Tk. Т.е все что мы пишем с использованием Tkx, на самом деле вызывается в среде Tcl.
Tcl — командный язык инструментов. Ничего сложного в нем нет, синтаксис прост:
команда аргумент1 аргумент2 ..аргументNТакже в языке есть поддержка пакетов (или модулей как в Perl), вызов будет следующий
пакет::команда аргумент1 аргумент2 ..аргументNОснова Tk это виджеты. Каждый созданный виджет имеет свое имя.
Пример
. — главное окно.
.f — главный фрейм.
.f.b — кнопка на главном фрейме.
Tkx предоставляет объектно-ориентированный подход, поэтому вам ненужно беспокоиться об именах. Tkx сделает все сам. Также применяется соглашение относительно вызовов (это самое главное). Ниже будут представлены примеры.
TCL:
package require BWidgetPerl:
Tkx::package_require('BWidget');TCL:
ttk::button .b -text "Hello World" -command exitPerl:
my $b = $main_window->new_ttk__button( -text => 'Hello World', -command => sub { exit; } );TCL:
tk_messageBox -message "Press OK"Perl:
Tkx::tk___messageBox( -message => 'Press OK' );Если мы хотим произвести какое-либо действие над уже созданным объектом, то можно использовать более краткую форму (используется префикс g_). К примеру, необходимо задать заголовок окна
Tcl:
wm title . "Main Window"Полная форма:
Tkx::wm_title( '.', 'Main Window' );Краткая:
$main_window->g_wm_title( 'Main Window' );Иными словами, '::' в перл будет '__' (два подчеркивания), пробел в составных командах — одно подчеркивание '_', а нижнее подчеркивание в Tcl обозначается через 3 подчеркивания �� Perl '___';
Каждая программа должна иметь вызов основного цикла событий (MainLoop), или
Tkx::MainLoop();Справочник по командам Tcl/Tk можно найти здесь.
А теперь рабочий пример.

Исходный код:
#!/usr/bin/perl
use strict;
use Tkx;
our $PROGNAME = 'MyProgram';
our $VERSION = '0.1';
# создаем главное окно
my $main_window = Tkx::widget->new( '.' );
# устанавливаем заголовок
$main_window->g_wm_title( 'Main Window' );
# создаем и прикрепляем меню
$main_window->configure( -menu => make_menu( $main_window ) );
# подпрограмма создания главного меню
sub make_menu {
my $mw = shift;
# отключаем режим открепления меню (подобно в GIMP)
Tkx::option_add( '*tearOff', 0 );
# в зависимости от ОС, идентификатор кнопки Ctrl/Control может меняться
my $control = ($^O eq "darwin") ? "Command" : "Control";
my $ctrl = ($^O eq "darwin") ? "Command-" : "Ctrl+";
# верхние уровни
my $menu = $mw->new_menu();
my $menu_file = $menu->new_menu();
my $menu_help = $menu->new_menu();
$menu->add_cascade(
-label => 'File',
-menu => $menu_file,
);
$menu->add_cascade(
-label => 'Help',
-menu => $menu_help,
);
# Добавляем элементы в меню File
$menu_file->add_command(
-label => 'Quit',
-command => sub { $mw->g_destroy(); },
);
# меню Help
$menu_help->add_command(
-label => 'About...',
-command => sub {
Tkx::tk___messageBox(
-title => 'About...',
-message => "$PROGNAME $VERSION",
);
},
);
# возвращаем меню
return $menu;
}
# запускаем основной цикл
Tkx::MainLoop();в следующей части рассмотрим основные виджеты, а также некоторые особенности в работе на OSX.
