Perl и GUI. Часть 1

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

    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 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, без конвертации в фцги.

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