Пользователь
0,0
рейтинг
27 июля 2009 в 12:37

Разработка → Perl и GUI. Часть 1

Perl*
В предыдущем посте мы разобрались с библиотеками для написания 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.

@santeri
карма
66,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (8)

  • –1
    Автора спросили зачем Tkx если есть wx/Qt но он упорна продолжил…

    Просто не понятно зачем мне заморачиватся еще на один язык (развитие и все такое я понимаю), но все таки.
    • 0
      Ну, знаком автор с Tkx, вот и пишет о нем.

      Я, вон, написал длинную статью про FastCGI в Perl, а сейчас я уверенно считаю технологию FastCGI порочной и бесполезной. Тем не менее, кто-то юзает FastCGI и статья им пригодится. Так и с Tkx — кому-то пригодится.
      • 0
        на правах оффтопа:
        не надо про фцги в перл. вот уж действительно что пошло и порочно.

        а чем вам порочен фцги?
        • 0
          >вот уж действительно что пошло и порочно.
          >а чем вам порочен фцги?

          эээ… Вы разрываете мой мозг… это было возражение или согласие?
          • 0
            да, я слегка не точен. я хотел сказать, что мне нравится фцги и все с ним хорошо в концепции технологии, а вот его реализация в перле мне не нравится: то течет по памяти, то виснет, то что-то еще. возможно я просто не умею его готовить. но действительно был прецендент, что если бы не ограничение памяти на процесс, оно бы сожрало все что есть и начало свапится вся система :((

            ну а в вопросе мне интеренсо узнать, чем вам не нравится фцги как технология, а не как его реализация в перл. :)
            • 0
              Фцги, как технология, разочаровал меня своей бессмысленностью.

              Даже не знаю, как сформулировать… Лучше всего тут, наверное, подойдет ответ вопросом на вопрос: «А какую проблему решает фцги?». Я сейчас не вижу такой проблемы.
              • 0
                эээ )) проблему реализации динамики для nginx? :) apache считаю избыточным по требованиям к ресурсам и бесползеным с точки зрения функционала. весь этот комбайн мне лично не нужен, достаточно связки nginx + $lang-fcgi. универсально, просто и безопасно. очень просто каждый инстанс того же spawn'а с php-cgi запускать от отдельного пользователя и не гемороится с php_suexec или чем там еще… :/
                • 0
                  А зачем тут фцги? Проксируйте на обработчики исходный http, без конвертации в фцги.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.