Pull to refresh

Perl и GUI. Часть 1

Reading time3 min
Views6.8K
В предыдущем посте мы разобрались с библиотеками для написания GUI на Perl. Поэтому можно приступить к работе.

Сегодня мы попробуем создать простое приложение (окно и главное меню).
Я буду использовать 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 можно найти здесь.

А теперь рабочий пример.
image

Исходный код:
#!/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.

Tags:
Hubs:
+14
Comments8

Articles

Change theme settings