介绍
IBM®AIX®操作系统管理员和开发人员通常使用Perl语言,几乎在每个成功的网站和大多数AIX系统上都可以找到Perl语言。 尽管Perl脚本功能强大,但它们产生的Web界面缺少图形化前端,并迫使用户键入信息而不是使用鼠标,这可能会使客户感到不满意。 通过在Perl中引入Tk模块已经解决了该问题。 管理员或开发人员可以使用Tk模块快速为其Perl脚本注入新的活力,并满足客户对X11产品的需求。
小部件
如本系列文章的 第1部分所述,小部件可以定义为执行特定功能的图形对象。 Perl / Tk模块中的任何图形对象都可以视为小部件。 当想到GUI应用程序时,按钮,文本,框架和滚动条都是小部件。 本文是系列文章的第三部分,讨论了诸如DirTree,LabEntry,LabFrame和Table之类的小部件。
Tree树
编程的主要视觉组件是如何处理搜索文件和目录。 解决此难题的一种方法是使用DirTree小部件。
使用Perl / Tk模块,创建目录列表很简单:
#!/usr/bin/perl –w
#create a directory listing with DirTree
use Tk;
use strict;
use Tk::DirTree;
use Cwd;
my $mw = MainWindow->new;
$mw->geometry("300x400");
$mw->title("DirTree Example");
my $CWD = Cwd::cwd();
my $DIR_TREE = $mw->Scrolled('DirTree',
-scrollbars => "osoe",
-width => 30,
-height => 25,
-exportselection => 1,
-browsecmd => sub {$CWD = shift},
-command => \&show_cwd)->pack(-fill => "both",
-expand => 1);
$DIR_TREE->chdir($CWD);
my $button_frame = $mw->Frame()->pack(-side => "bottom");
$button_frame->Button(-text => "Ok",
-command => \&show_cwd)->pack(-side => "left");
$button_frame->Button(-text => "Exit",
-command => sub{exit})->pack(-side => "left");
sub show_cwd {
$mw->messageBox(-message => "Directory Selected: $CWD", -type => "ok");
}
MainLoop;
执行此脚本将生成图1和2所示的GUI应用程序:
图1. DirTree小部件的示例
图2.显示所选目录
让我们分解一下脚本。
为了回顾本系列第1部分和第2部分中讨论的内容,除非在以下示例中进行了任何更改,否则代码的第一部分将仅讨论一次。 第一部分(/ usr / bin / perl)定义Perl可执行文件在计算机上的驻留位置,并指示计算机使用Perl可执行文件的此副本来执行文件multi_windows_at_once-demo.pl:
#!/usr/bin/perl -w
该行的第二部分(-w)在Perl中是有价值的工具。 它在执行脚本时启用警告,将发现的任何可能的错误通知最终用户。
在执行时不应该进行评估的注释和文本的前面加上一个八度(#):
#create a directory listing with DirTree
为了使Perl脚本使用Tk模块,必须将其包括在内。 因此use Tk
。 将use strict
语句添加到Perl脚本中还有助于查找任何可能的错别字或逻辑错误:
use Tk;
use strict;
要使用DirTree小部件,必须将其包括在Perl脚本中,因为它不是基本Perl模块中的常规小部件。 第二个包含项是Cwd
。 使用此脚本可以找到并存储CWD或当前工作目录:
use Tk::DirTree;
use Cwd;
要创建应用程序的主窗口,请使用MainWindow
并将其分配给$mw
。 $mw
充当创建的所有其他小部件的父级(如本文进一步讨论):
my $mw = MainWindow->new;
将主窗口的大小设置为300x400 ,并为主窗口命名DirTree示例 :
$mw->geometry("300x400");
$mw->title("DirTree Example");
找到CWD,并将其存储在名为$CWD
的变量中:
my $CWD = Cwd::cwd();
创建一个可滚动的目录树。 最终用户每次选择目录时, browsecmd
选项都会重置$CWD
。 如果最终用户在目录上双击或按Enter键,则command
选项将执行子例程show_cmd
:
my $DIR_TREE = $mw->Scrolled('DirTree',
-scrollbars => "osoe",
-width => 30,
-height => 25,
-exportselection => 1,
-browsecmd => sub {$CWD = shift},
-command => \&show_cwd)->pack(-fill => "both",
-expand => 1);
刷新显示用户CWD的目录树:
$DIR_TREE->chdir($CWD);
创建一个框架,并在其中放置两个按钮。 标有“ OK”的第一个按钮执行子例程show_cmd
; 第二个按钮退出脚本:
my $button_frame = $mw->Frame()->pack(-side => "bottom");
$button_frame->Button(-text => "Ok",
-command => \&show_cwd)->pack(-side => "left");
$button_frame->Button(-text => "Exit",
-command => sub{exit})->pack(-side => "left");
当执行子例程show_cmd
,将显示一个messageBox小部件,向用户显示其CWD:
sub show_cwd {
$mw->messageBox(-message => "Directory Selected: $CWD", -type => "ok");
}
在执行MainLoop
之前,将读取,定义脚本中的所有内容,并准备执行它们。 然后,当调用MainLoop
时,将执行所有功能和事先读取的数据,并显示GUI:
MainLoop;
LabEntry
许多GUI应用程序需要最终用户手动输入。 显示指令和请求输入的一种方法是使用Label和Entry小部件(在本系列的第1部分中进行了讨论)。 另一种方法使用LabEntry小部件。 LabEntry将Label,Entry和Frame小部件组合为一个易于使用的小部件:
#!/usr/bin/perl -w
use Tk;
use Tk::LabEntry;
use strict;
my $mw = MainWindow->new;
$mw->geometry("300x100");
$mw->title("LabEntry Example");
my $name = "";
$mw->LabEntry(-label => "Enter your name: ",
-labelPack => [ -side => "left" ],
-textvariable => \$name)->pack();
my $button_frame = $mw->Frame()->pack(-side => "bottom");
$button_frame->Button(-text => "Ok",
-command => \&show_greeting)->pack(-side => "left");
$button_frame->Button(-text => "Exit",
-command => sub{exit})->pack(-side => "left");
sub show_greeting {
my $msg = "Who are you?";
if ($name ne "") { $msg = "Nice to meet you $name!"; }
$mw->messageBox(-message => "$msg\n", -type => "ok");
}
MainLoop;
执行此脚本将生成图3和图4所示的GUI应用程序。
图3. LabEntry小部件的示例
图4. LabEntry小部件的结果
让我们分解一下脚本。
像前面的DirTree示例一样,需要包含LabEntry小部件。 如果您不包括该小部件,则Perl脚本不知道如何中断或执行LabEntry小部件:
use Tk::LabEntry;
定义一个名为$name
的变量,并将其值设置为NULL或什么都不做。 定义变量后,创建带有标签Enter your name:的LabEntry小部件,将标签放在条目的左侧,然后将输入的值分配给变量$name
:
my $name = "";
$mw->LabEntry(-label => "Enter your name: ",
-labelPack => [ -side => "left" ],
-textvariable => \$name)->pack();
创建一个框架,并在其中包含两个Button小部件。 标有“ OK”的第一个按钮执行子例程show_greeting
; 第二个退出脚本:
my $button_frame = $mw->Frame()->pack(-side => "bottom");
$button_frame->Button(-text => "Ok",
-command => \&show_greeting)->pack(-side => "left");
$button_frame->Button(-text => "Exit",
-command => sub{exit})->pack(-side => "left");
单击确定按钮后,将执行子例程show_greeting
。 变量$msg
用值“您是谁”定义。 如果最终用户忘记在LabEntry中输入其名称,则使用该值定义变量。 如果用户忘记了,变量$name
仍设置为NULL。 如果用户输入名称,则值“很高兴认识您$ name!”。 将设置为$msg
,可以在下一行代码中看到。 最后,向用户显示一个messageBox小部件,向他打招呼或让他知道程序不知道他是谁:
sub show_greeting {
my $msg = "Who are you?";
if ($name ne "") { $msg = "Nice to meet you $name!"; }
$mw->messageBox(-message => "$msg\n", -type => "ok");
}
LabFrame
框架小部件已在本系列文章中使用。 框架用于组织其他小部件,使应用程序看起来更简洁,更结构化。 LabFrame是随框架提供的便捷小部件。 使用LabFrame小部件,您只需花费很少的工作就可以在框架上或框架上放置标签:
#!/usr/bin/perl -w
use Tk;
use Tk::LabFrame;
use strict;
my $mw = MainWindow->new;
$mw->geometry("300x200");
$mw->title("LabFrame Example");
my $labeled_frame1 = $mw->LabFrame(-label => "Caption Across Top of Frame",
-labelside => "acrosstop")->pack();
my $labeled_frame2 = $mw->LabFrame(-label => "Caption Below Frame",
-labelside => "bottom")->pack(-fill => "x");
$labeled_frame1->Label(-text => "Inside Frame #1")->pack();
$labeled_frame2->Label(-text => "Inside Frame #2")->pack();
my $button_frame = $mw->Frame()->pack(-side => "bottom");
$button_frame->Button(-text => "Exit",
-command => sub{exit})->pack();
MainLoop;
执行此脚本将生成图5所示的GUI应用程序。
图5. LabFrame小部件的示例
让我们分解一下脚本。
LabFrame小部件与本文前面的小部件示例没有什么不同,需要包括在内:
use Tk::LabFrame;
创建一个框架,并将其标签为“ 跨框架顶部的标题” 。 要放在作为标题暗示框架的顶部标题,您必须配置,其值为“acrosstop”为选项LabFrame部件labelside
:
my $labeled_frame1 = $mw->LabFrame(-label => "Caption Across Top of Frame",
-labelside => "acrosstop")->pack();
创建第二个LabFrame小部件,但不要在框架的顶部运行标题,而是将标签Caption Under Frame放置在框架下方,并将选项labelside
设置为“底部”:
my $labeled_frame2 = $mw->LabFrame(-label => "Caption Below Frame",
-labelside => "bottom")->pack(-fill => "x");
要演示LabFrame中的小部件,请通过其父LabFrame小部件创建两个Label小部件:
$labeled_frame1->Label(-text => "Inside Frame #1")->pack();
$labeled_frame2->Label(-text => "Inside Frame #2")->pack();
表
Table小部件是Perl脚本的强大补充。 该窗口小部件创建一个二维窗口小部件表。 您可以使用表来代替显示未组织的长数据列表:
#!/usr/bin/perl -w
use Tk;
use Tk::Table;
use strict;
my $mw = MainWindow->new;
$mw->geometry("475x125");
$mw->resizable(0,0);
$mw->title("Table Example");
my $table_frame = $mw->Frame()->pack();
my $table = $table_frame->Table(-columns => 8,
-rows => 4,
-fixedrows => 1,
-scrollbars => 'oe',
-relief => 'raised');
foreach my $col (1 .. 8)
{
my $tmp_label = $table->Label(-text => "COL " . $col, -width => 8, -relief =>'raised');
$table->put(0, $col, $tmp_label);
}
foreach my $row (1 .. 8)
{
foreach my $col (1 .. 8)
{
my $tmp_label = $table->Label(-text => $row . "," . $col,
-padx => 2,
-anchor => 'w',
-background => 'white',
-relief => "groove");
$table->put($row, $col, $tmp_label);
}
}
$table->pack();
my $button_frame = $mw->Frame( -borderwidth => 4 )->pack();
$button_frame->Button(-text => "Exit", -command => sub {exit})->pack();
MainLoop;
执行此脚本将生成图6所示的GUI应用程序。
图6. Table小部件的示例
让我们分解一下脚本。
你猜到了! 必须包含另一个新的小部件,Perl才能知道如何处理Table小部件:
use Tk::Table;
在前面的示例中,最终用户可以调整应用程序的大小。 此脚本禁止用户调整窗口大小:
$mw->resizable(0,0);
创建一个框架以包含新表。 然后,创建Table小部件,该小部件显示八列和四行:
my $table_frame = $mw->Frame()->pack();
my $table = $table_frame->Table(-columns => 8,
-rows => 4,
-fixedrows => 1,
-scrollbars => 'oe',
-relief => 'raised');
要将数据放在表中,请使用put
操作。 循环浏览八次,将文本“ COL”添加到列号,并放置在表的第一(第0)行中:
foreach my $col (1 .. 8)
{
my $tmp_label = $table->Label(-text => "COL " . $col, -width => 8, -relief =>'raised');
$table->put(0, $col, $tmp_label);
}
现在已经创建了标题,将坐标放置在相应的单元格中。 同样,使用put
操作,遍历每一行和每一列,并分配单元格的文本。 然后,打包完成的表:
foreach my $row (1 .. 8)
{
foreach my $col (1 .. 8)
{
my $tmp_label = $table->Label(-text => $row . "," . $col,
-padx => 2,
-anchor => 'w',
-background => 'white',
-relief => "groove");
$table->put($row, $col, $tmp_label);
}
}
$table->pack();
帆布
“画布”小部件是Perl / Tk模块中的一个有用的绘图工具。 使用此小部件,用户可以绘制和操纵不同的形状和对象,例如线,椭圆,矩形和多边形:
#!/usr/bin/perl -w
use Tk;
use strict;
my $mw = MainWindow->new;
$mw->geometry("400x400");
$mw->title("Canvas Example");
my $canvas = $mw->Canvas(-relief => "sunken", -background => "blue");
$canvas->createLine(2, 3, 350, 100, -width => 10, -fill => "black");
$canvas->createLine(120, 220, 450, 200, -fill => "red");
$canvas->createOval(30, 80, 100, 150, -fill => "yellow");
$canvas->createRectangle(50, 20, 100, 50, -fill => "cyan");
$canvas->createArc(40, 40, 200, 200, -fill => "green");
$canvas->createPolygon(350, 120, 190, 160, 250, 120, -fill => "white");
$canvas->pack();
$mw->Button(-text => 'Exit', -command => sub {exit})->pack();;
MainLoop;
执行此脚本将生成图7所示的GUI应用程序。
图7. Canvas小部件的示例
让我们分解一下脚本。
这段代码创建了Canvas小部件:
my $canvas = $mw->Canvas(-relief => "sunken", -background => "blue");
创建一条宽度为10的黑线,并将其从(2,3)绘制为(350,100)。 在“画布”小部件中使用对象和形状时,第一组数字值是坐标。 用公式<object>(x1, y1, x2, y2, ....)
查看对象是最简单的:
$canvas->createLine(2, 3, 350, 100, -width => 10, -fill => "black");
$canvas->createLine(120, 220, 450, 200, -fill => "red");
在画布小部件上创建一个从(30,80)到(100,150)的黄色椭圆形:
$canvas->createOval(30, 80, 100, 150, -fill => "yellow");
在Canvas小部件上创建一个(50,20)到(100,50)的青色矩形:
$canvas->createRectangle(50, 20, 100, 50, -fill => "cyan");
在“画布”小部件上从(40,40)到(200,200)创建绿色弧:
$canvas->createArc(40, 40, 200, 200, -fill => "green");
在Canvas小部件上创建一个从(350,120)到(190,160)和(250,120)的白色多边形:
$canvas->createPolygon(350, 120, 190, 160, 250, 120, -fill => "white");
在创建所有对象之后,像往常一样,打包小部件:
$canvas->pack();
结论
将带有Perl / Tk模块的Perl引入AIX环境可以使开发人员,管理员以及客户或最终用户受益。 最初可以让客户觉得乏味的脚本可以增强为外观专业的GUI应用程序。 可能需要很短的时间才能掌握这些小部件,但是一旦掌握了这些小部件,就值得付出努力!
翻译自: https://www.ibm.com/developerworks/aix/library/au-perltkmodule3/index.html