В предыдущем посте мы разобрались с библиотеками для написания 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 BWidget
Perl:
Tkx::package_require('BWidget');
TCL:
ttk::button .b -text "Hello World" -command exit
Perl:
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.