Язык Perl обычно используется системными администраторами и разработчиками IBM® AIX®, он применяется почти на всех популярных Web-сайтах и в большинстве систем AIX. Хотя скрипты на Perl являются мощным средством, Web-интерфейс, созданный на их основе, не содержит графического оформления, и пользователю приходится набирать информацию с клавиатуры вместо того, чтобы пользоваться мышью, что может оказаться неприемлемым для заказчика. Эта проблема была решена с появлением в Perl модуля Tk. Модуль Tk позволяет администраторам и разработчикам быстро преобразовать скрипты в более удобный для пользователей вид, оснастив их графической оболочкой X11.
Perl (Practical Extraction and Reporting Language - практический язык для извлечения данных и составления отчётов) был создан Ларри Уоллом в 1987 году для облегчения собственной работы по программированию. С тех пор Perl приобрел популярность во всем мире и стал важным инструментом для большинства администраторов и разработчиков.
Модуль Perl/Tk, также известный как pTk или ptk, - это модуль, разработанный для создания виджетов и других распространенных графических объектов, образующих графический интерфейс пользователя (GUI). Использование Perl/Tk для создания GUI делает работу с программой более удобной и помогает конечному пользователю сориентироваться в программе и ее функциях. Одним из важнейших преимуществ использования модуля Perl/Tk является кросс-платформенность - одно и то же GUI-приложение может использоваться в UNIX®, Linux®, Macintosh, Microsoft® Windows® или любой другой операционной системе, в которой установлен Perl с модулем Tk.
Перед тем как написать приложение с использованием модуля Perl/Tk, необходимо иметь сам Perl и модуль Perl/Tk. Хотя Perl на большинстве компьютеров уже установлен, модуль Perl/Tk скорее всего отсутствует. Чтобы убедиться в том, что Perl установлен, введите команду perl --version. Если Perl не установлен, обратитесь к руководству по установке с сайта Perl (см. раздел
Ресурсы).
После того как вы найдете Perl на своем компьютере или установите его, нужно определить, необходимо ли установить модуль Perl/Tk. Самый простой способ проверить, установлен ли какой-либо модуль Perl на компьютере – ввести команду
perl -e "use module". Чтобы убедиться в том, что на компьютере установлен модуль Perl/Tk, введите следующую команду:
perl -e "use Tk" |
Если модуль найден, команда будет выполнена и возвратит приглашение командной строки. В противном случае, если модуль отсутствует, будет выведено следующее сообщение об ошибке:
Can't locate Tk.pm in @INC (@INC contains: /opt/ActivePerl-5.8/site/lib
/opt/ActivePerl-5.8/lib .) at -e line 1.
BEGIN failed--compilation aborted at -e line 1.
|
Запомните, что синтаксис Perl чувствителен к регистру:
perl -e "use Tk" и
perl -e "use tk" - это две разные команды, обращающиеся к двум различным модулям (Tk и tk).
Если модуль не обнаружен, следующим шагом будет его загрузка и установка. Это можно сделать различными способами.
Если вы используете ОС UNIX или Linux, один из способов загрузить и установить модули Perl – это использовать сеть архивов CPAN (Comprehensive Perl Archive Network). Введите следующую команду:
perl –MCPAN –e shell
install Bundle::CPAN
reload cpan
install Tk
|
В ОС Windows для тех же целей используется менеджер пакетов Perl (Perl Package Manager, PPM). В командной строке введите ppm для запуска графического интерфейса и загрузки модуля Tk.
После завершения установки еще раз убедитесь том, что Perl обнаружил данный модуль, введя команду perl –e "use Tk".
Теперь, когда на вашем компьютере установлены Perl и модуль Tk, самое время написать первую программу с графическим интерфейсом при помощи этого модуля. Мы начнем с простой программы Hello World. При помощи вашего любимого текстового редактора создайте файл helloworld.pl и введите в него следующий текст:
#!/usr/bin/perl -w
# Display Hello World program
use Tk;
use strict;
my $mw = MainWindow->new;
$mw->geometry("200x100");
$mw->title("Hello World!!!");
$mw->Label(-text => 'Hello World')->pack();
$mw->Button(-text => "Close", -command =>sub{exit})->pack();
MainLoop;
|
Выполнение скрипта генерирует GUI-приложение, показанное на рисунке 1.
Рисунок 1. Пример скрипта Hello World
Давайте разберем данный скрипт построчно:
#!/usr/bin/perl -w
|
Первая часть (/usr/bin/perl) определяет расположение исполняемых файлов Perl и указывает компьютеру использовать данную копию Perl для выполнения скрипта helloworld.pl file. Вторая часть этой строки (-w) - это полезное средство Perl: этот параметр активирует вывод предупреждений для конечного пользователя при возникновении любых ошибок.
Комментарии и текст, который не должен обрабатываться при выполнении программы, начинаются с символа решетки # symbol:
# Display Hello World program |
Чтобы скрипт Perl использовал модуль Tk, модуль необходимо включить – при помощи оператора use Tk. Оператор use strict также помогает выявлению различных опечаток или логических ошибок.
use Tk;
use strict;
|
Чтобы создать первичное окно приложения, используйте
MainWindow и назначьте его
$mw. $mw выступает в роли родителя для всех остальных виджетов.
my $mw = MainWindow->new;
|
Укажите размер окна 200 x 100 и заголовок окна "Hello World!!!".
$mw->geometry("200x100");
$mw->title("Hello World!!!");
|
Создайте надпись в главном окне с заголовком Hello World. Оператор создания надписи завершается дополнительным методом
pack, который обрабатывает геометрию объектов. Этот метод используется в виджетах для вычисления пространства, выделенного из родительского виджета; он также отображает сам виджет.
$mw->Label(-text => 'Hello World')->pack();
|
Следующая строка создает кнопку Close (Закрыть) в главном окне. При активации с помощью мыши клавиатуры эта кнопка закрывает скрипт Perl.
$mw->Button(-text => "Close", -command =>sub{exit})->pack();
|
Так как кнопка занимает место в главном окне, вам снова необходимо использовать метод
pack для расчета занимаемого пространства.
Перед выполнением оператора MainLoop в скрипте все должно быть прочитано, определено и готово к выполнению. При вызове
MainLoop все функции и данные считываются перед выполнением, а затем выводится графический интерфейс.
MainLoop;
|
Этот раздел содержит введение в виджеты. В нем рассматривается несколько основных виджетов с примерами: фреймы, текстовое поле, поле ввода, кнопки и надписи.
Виджет – это графический объект, выполняющий определенную функцию. Любой графический объект в модуле Perl/Tk может рассматриваться как виджет. Если вы представляете себе приложение с графическим интерфейсом, кнопки, текст, фреймы и полосы прокрутки – все это виджеты.
Следующие примеры составляют основу виджетов, обсуждаемых далее в этой статье.
Фрейм, в точном соответствии со своим названием (frame – рамка), представляет собой рамку или блок. Фрейм используется для группировки других виджетов.
Создайте скрипт следующего содержания:
#!/usr/bin/perl -w
use Tk;
use strict;
my $mw = MainWindow->new;
$mw->geometry("200x100");
$mw->title("Frame Test");
$mw->Frame(-background => 'red')->pack(-ipadx => 50, -side => "left", -fill => "y");
$mw->Frame(-background => 'blue')->pack(-ipadx => 50, -side => "right", -fill => "y");
MainLoop;
|
Запуск этого скрипта генерирует GUI-приложение, показанное на рисунке 2.
Рисунок 2. Пример использования фреймов
Давайте разберем этот скрипт:
#!/usr/bin/perl -w
use Tk;
use strict;
my $mw = MainWindow->new;
$mw->geometry("200x100");
$mw->title("Frame Test");
…
…
MainLoop;
|
Эта часть скрипта была рассмотрена в предыдущем примере, поэтому давайте сразу перейдем к новым операторам.
Создаем фрейм с главным окном в качестве родителя и указываем цвет фона – красный. В отличие от предыдущего примера, метод pack имеет несколько параметров.
$mw->Frame(-background => 'red')->pack(-ipadx => 50, -side => "left", -fill => "y");
|
Первый аргумент ipadx увеличивает ширину фрейма до 100 (50 x 2). Второй аргумент side выравнивает фрейм по левой стороне родительского объекта
($mw). Третий аргумент выделяет место во фрейме по оси y (по вертикали).
Следующий фрейм похож на предыдущий, но цвет его фона – синий, и он выровнен по правой стороне главного окна.
$mw->Frame(-background => 'blue')->pack(-ipadx => 50, -side => "right", -fill => "y");
|
Текстовое поле создает рабочую область для редактирования текста. Создайте скрипт следующего содержания:
#!/usr/bin/perl -w
use Tk;
use strict;
my $mw = MainWindow->new;
$mw->geometry("200x100");
$mw->title("Text Test");
$mw->Text(-background => 'cyan', -foreground => 'white')->pack(-side => "top");
MainLoop;
|
Запуск этого скрипта и ввод текста генерирует GUI-приложение, показанное на рисунке 3.
Рисунок 3. Пример текстового поля
В этом примере текстовый виджет создается с главным окном в качестве родителя:
$mw->Text(-background => 'cyan', -foreground => 'white')->pack(-side => "top");
|
Кроме изменения цвета фона, можно менять только цвет шрифта. Как всегда, для выделения места и отображения виджета используется метод pack.
Поле ввода похоже на текстовое поле тем, что позволяет вводить или редактировать текст. Текстовое поле позволяет вводить многострочный текст, а поле ввода - только одну строку текста.
Создайте скрипт следующего содержания:
#!/usr/bin/perl -w
use Tk;
use strict;
my $mw = MainWindow->new;
$mw->geometry("200x100");
$mw->title("Entry Test");
$mw->Entry(-background => 'black', -foreground => 'white')->pack(-side => "top");
MainLoop;
|
Запуск этого скрипта и ввод текста генерирует GUI-приложение, показанное на рисунке 4.
Рисунок 3. Пример поля ввода
Единственное отличие от текстового поля – это наименование виджета:
$mw->Entry(-background => 'black', -foreground => 'white')->pack(-side => "top");
|
Однако, как показано в примере, вы можете ввести только одну строку текста.
Виджет-кнопка создает кнопку, которая может выполнять функции или команды, когда ее активирует конечный пользователь. Почти все программы с графическим интерфейсом используют кнопки, поэтому с этим виджетом стоит познакомиться поближе.
В следующем примере используется три кнопки. Первая, с надписью Button 1 (Кнопка 1), выводит сообщение Button 1 pushed (Нажата кнопка 1) с кнопкой ОК. Вторая, с надписью Button 2 (Кнопка 2), выводит сообщение Button 2 pushed (Нажата кнопка 2) с кнопками Yes и No и предложением завершить работу программы. В зависимости от того, какая кнопка будет нажата, будет выведено новое сообщение, указывающее, какая кнопка нажата, и соответственно будет или не будет выполнен выход из программы.
Ниже приведен пример скрипта:
#!/usr/bin/perl -w
use Tk;
use strict;
my $mw = MainWindow->new;
$mw->geometry("200x100");
$mw->title("Button Test");
my $button1 = $mw->Button(-text => "Button #1", -command => \&button1_sub)->pack();
my $button2 = $mw->Button(-text => "Button #2", -command => \&button2_sub)->pack();
sub button1_sub {
$mw->messageBox(-message => "Button 1 Pushed", -type => "ok");
}
sub button2_sub {
my $yesno_button = $mw->messageBox(-message => "Button 2 Pushed. Exit?",
-type => "yesno", -icon => "question");
$mw->messageBox(-message => "You pressed $yesno_button!", -type => "ok");
if ($yesno_button eq "Yes") {
$mw->messageBox(-message => "Ok, Exiting.", -type => "ok");
exit;
} else {
$mw->messageBox(-message => "I didn't think so either.", -type => "ok");
}
}
MainLoop;
|
Запуск этого скрипта генерирует GUI-приложение, показанное на рисунках с 5 по 11.
Рисунок 5. Пример виджета с кнопками
Рисунок 6. Нажата кнопка 1
Рисунок 7. Нажата кнопка 2
Рисунок 8. Нажата кнопка No
Рисунок 9. Подтверждение нажатия кнопки No
Рисунок 10. Нажата кнопка Yes
Рисунок 11. Подтверждение нажатия кнопки Yes
Это скрипт сложнее, чем предыдущие примеры, но разобрать его так же просто, как и остальные. Вначале создается каждая кнопка и ей присваивается соответствующий текст (Button #1 или
Button #2). Каждая кнопка связывается с командой или функцией. Соответствующие подпрограммы называются
button1_sub и button2_sub:
my $button1 = $mw->Button(-text => "Button #1", -command => \&button1_sub)->pack();
my $button2 = $mw->Button(-text => "Button #2", -command => \&button2_sub)->pack();
|
При нажатии кнопки $button1 выполняется подпрограмма
button1_sub. Внутри нее создается сообщение, отображающее текст Button 1 Pushed (Нажата кнопка 1) с единственной кнопкой OK. Поскольку с кнопкой ОК более не связано никаких функций, при ее нажатии сообщение закрывается, и фокус возвращается к главному окну.
sub button1_sub {
$mw->messageBox(-message => "Button 1 Pushed", -type => "ok");
}
|
Эта подпрограмма похожа на предыдущую, за исключением того, что она содержит две кнопки Yes и No. Когда пользователь нажимает кнопку, появляется новое сообщение, указывающее, какая кнопка была нажата. Затем отображается другое сообщение, указывающее, будет ли закрыта программа.
sub button2_sub {
my $yesno_button = $mw->messageBox(-message => "Button 2 Pushed. Exit?",
-type => "yesno", -icon => "question");
$mw->messageBox(-message => "You pressed $yesno_button!", -type => "ok");
if ($yesno_button eq "Yes") {
$mw->messageBox(-message => "Ok, Exiting.", -type => "ok");
exit;
} else {
$mw->messageBox(-message => "I didn't think so either.", -type => "ok");
}
}
|
Надпись – это виджет с неизменяемым текстом. Надписи можно размещать перед текстовыми полями и полями ввода. Создайте скрипт следующего содержания:
#!/usr/bin/perl -w
use Tk;
use strict;
my $mw = MainWindow->new;
$mw->geometry("200x100");
$mw->title("Entry Test");
$mw->Label(-text => "What's your name?")->pack(-side => "left");
$mw->Entry(-background => 'black', -foreground => 'white')->pack(-side => "right");
MainLoop;
|
Запуск этого скрипта и ввод текста генерирует GUI-приложение, показанное на рисунке 12.
Рисунок 12. Пример виджета с надписью
Первая строка создает надпись с текстом What's your name? (Как вас зовут?):
$mw->Label(-text => "What's your name?")->pack(-side => "left");
$mw->Entry(-background => 'black', -foreground => 'white')->pack(-side => "right");
|
Чтобы расположить надпись слева от поля ввода, укажите для метода pack выравнивание по левой стороне. Как и в предыдущих примерах, поле ввода создается с черным фоном и белым текстом. Чтобы расположить надпись справа от поля ввода, укажите для метода pack выравнивание по правой стороне.
Теперь, когда мы изучили несколько типов виджетов, давайте соберем их вместе в один скрипт.
#!/usr/bin/perl -w
use Tk;
use strict;
my $mw = MainWindow->new;
$mw->geometry("500x200");
$mw->title("All-In-One Test");
my $main_frame = $mw->Frame()->pack(-side => 'top', -fill => 'x');
my $top_frame = $main_frame->Frame(-background => "red")->pack(-side => 'top',
-fill => 'x');
my $left_frame = $main_frame->Frame(-background => "black")->pack(-side => 'left',
-fill => 'y');
my $right_frame = $main_frame->Frame(-background => "white")->pack(-side => "right");
$top_frame->Label(-text => "All-In-One Test!",
-background => "red")->pack(-side => "top");
$left_frame->Label(-text => "Enter text to copy", -background => "black",
-foreground => "yellow")->pack(-side => "left");
my $copy_entry = $left_frame->Entry(-background => "white",
-foreground => "red")->pack(-side => "left");
my $copy_button = $left_frame->Button(-text => "Copy Text",
-command => \©_entry)->pack(-side => "right");
my $clear_text = $right_frame->Button(-text => "Clear Text",
-command => \&clear_entry)->pack(-side => "top");
my $paste_text = $right_frame->Text(-background => "white",
-foreground => "black")->pack(-side => "top");
sub clear_entry {
$paste_text->delete('0.0', 'end');
}
sub copy_entry {
my $copied_text = $copy_entry->get();
$paste_text->insert("end", $copied_text);
}
MainLoop;
|
Запуск этого скрипта и ввод текста генерирует GUI-приложение, показанное на рисунке 13.
Рисунок 13. Сводный пример
Давайте разберем этот скрипт так же, как другие примеры. Сначала мы создаем основной фрейм и три фрейма внутри него. Эти фреймы содержат остальные виджеты и задают структуру интерфейса.
my $main_frame = $mw->Frame()->pack(-side => 'top', -fill => 'x');
my $top_frame = $main_frame->Frame(-background => "red")->pack(-side => 'top',
-fill => 'x');
my $left_frame = $main_frame->Frame(-background => "black")->pack(-side => 'left',
-fill => 'y');
my $right_frame = $main_frame->Frame(-background => "white")->pack(-side => "right");
|
Затем добавляем надписи: одну в верхнем фрейме, другую в левом фрейме.
$top_frame->Label(-text => "All-In-One Test!",
-background => "red")->pack(-side => "top");
$left_frame->Label(-text => "Enter text to copy", -background => "black",
-foreground => "yellow")->pack(-side => "left");
|
В дополнение к надписи в левом фрейме создаем поле ввода, чтобы пользователь мог ввести текст, который он хочет скопировать. Также создаем кнопку, которой назначаем функцию копирования текста в текстовое поле правого фрейма.
my $copy_entry = $left_frame->Entry(-background => "white",
-foreground => "red")->pack(-side => "left");
my $copy_button = $left_frame->Button(-text => "Copy Text",
-command => \©_entry)->pack(-side => "right");
|
Теперь взгляните на правый фрейм. Кнопка позволяет пользователю стирать весь текст в текстовом поле.
my $clear_text = $right_frame->Button(-text => "Clear Text",
-command => \&clear_entry)->pack(-side => "top");
my $paste_text = $right_frame->Text(-background => "white",
-foreground => "black")->pack(-side => "top");
|
Также создаем текстовое поле, чтобы пользователь мог скопировать текст из поля ввода и при желании отредактировать его.
Ниже приведены подпрограммы для очистки поля и копирования.
sub clear_entry {
$paste_text->delete('0.0', 'end');
}
sub copy_entry {
my $copied_text = $copy_entry->get();
$paste_text->insert("end", $copied_text);
}
|
Функция clear_entry удаляет весь текст, начиная с позиции 0.0 (строка 0 символ 0) до конца текстового поля. Функция
copy_entry запрашивает текст в поле ввода и вставляет его в текстовое поле.
Введение в использование Perl с модулем Perl/Tk в среде AIX будет полезно разработчикам, администраторам, а также клиентам и конечным пользователям. Вы можете превратить сложный для восприятия скрипт в профессионально оформленное приложение с графическим интерфейсом. Чтобы научиться работать с виджетами, потребуются некоторые усилия, но когда вы освоитесь, результат оправдает затраты.
Научиться
-
Оригинал статьи (EN).
- "Визуализация данных при помощи Perl/Tk"
(developerWorks, август 2003 г.; EN) – статья содержит дополнительные примеры использования модуля Perl/Tk.
- Раздел
AIX и
UNIX® сайта developerWorks содержит множество информации, связанной со всеми аспектами системного администрирования систем AIX и расширения ваших знаний о UNIX.
-
Новости AIX и UNIX (EN): Посетите страницу "Новости AIX и UNIX", чтобы узнать больше о AIX и UNIX.
-
Популярные материалы (EN):
познакомьтесь с материалами о AIX и UNIX, которые сочли интересными другие пользователи.
-
AIX Wiki:
среда совместной работы для размещения технической информации о AIX.
- В библиотеке AIX и UNIX содержится информация по темам:(EN)
- Системное администрирование
- Разработка приложений
- Производительность
- Портирование
- Безопасность
- Советы
- Инструменты и утилиты
- Технология Java™
- Linux®
- Open source
-
Библиотека Safari:
посетите эту электронную библиотеку, чтобы найти необходимую техническую информацию.(EN)
- Раздел
технических мероприятий и Web-трансляций на developerWorks:
поможет вам оставаться в курсе новостей.(EN)
-
Подкасты IBM: настройте и получайте материалы от технических экспертов IBM.
Получить продукты и технологии
-
Perl: здесь можно скачать последнюю версию.
-
ActivePerl – это бесплатный и готовый к использованию дистрибутив Perl для Windows, Mac, OS X, Linux, Solaris, AIX и HP-UX.
- Создайте свою следующую разработку при помощи
ознакомительного ПО IBM®.(EN)
Обсудить
- Примите участие в обсуждении материала на форуме.
- Примите участие в
блогах developerWorks и сообществе developerWorks.
- Посетите форумы AIX и UNIX: (EN)
- AIX 5L - technical forum
- AIX for Developers Forum
- Cluster Systems Management
- IBM Support Assistant
- Performance Tools - technical
- Virtualization - technical
- More AIX and UNIX forums
Являясь на сегодняшний день администратором национального центра данных, Адам Кормэни (Adam Cormany) в течение последних нескольких лет работал системным инженером UNIX, администратором UNIX и руководителем эксплуатации группы технического сопровождения корпорации Scientific Games. Адам более 10 лет вплотную занимался администрированием операционных систем AIX, Solaris и Red Hat Linux, и имеет статус сертифицированного специалиста IBM по eServer в области администрирования систем pSeries AIX. Помимо администрирования, Адам обладает глубокими знаниями в области написания shell-скриптов для командных оболочек BASH, CSH и KSH, а также умеет программировать на языках C, PHP и Perl.