ios小部件

    技术2024-06-09  86

    介绍

    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

    相关资源:微信小程序源码-合集6.rar
    Processed: 0.019, SQL: 9