ios小部件_高级小部件

介绍

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小部件的示例
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小部件的示例
LabEntry小部件的示例
图4. LabEntry小部件的结果
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小部件的示例

让我们分解一下脚本。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值