perltk

    技术2024-06-28  80

    IBM®AIX®操作系统管理员和开发人员通常使用Perl语言,几乎在每个成功的网站和大多数AIX系统上都可以找到它。 尽管Perl脚本功能强大,但它们产生的Web界面缺少图形化前端,并且用户必须键入信息而不是使用鼠标,这对于客户而言可能是令人不满意的体验。 通过在Perl中引入Tk模块已经解决了该问题。 管理员或开发人员可以使用Tk模块快速为其Perl脚本注入新的活力,并满足客户对X11产品的需求。

    什么是Perl?

    Perl(即实用提取和报告语言)由Larry Wall于1987年创建,旨在简化他的编程工作。 从概念开始,Perl就已经发展成为一种全球使用的语言,并且是大多数管理员和开发人员的必备内容。

    什么是Perl / Tk模块?

    Perl / Tk模块,也称为pTk或ptk,是一个Perl模块,旨在创建小部件和其他常用图形对象以形成图形用户界面(GUI)。 使用该模块创建GUI可以增强程序的外观,并帮助最终用户浏览该程序及其功能。 使用Perl / Tk模块的一个主要优点是生成的应用程序可以跨平台,这意味着同一GUI应用程序可以在UNIX®,Linux®,Macintosh,Microsoft®Windows®或具有以下功能的任何其他操作系统上使用已安装Perl和Perl / Tk模块。

    在哪里获得Perl / Tk模块

    在使用Perl / Tk模块编写应用程序之前,必须验证是否已安装Perl和Perl / Tk模块。 尽管Perl通常安装在计算机上,但Perl / Tk模块却不是。 验证是否已安装Perl的一种方法是在命令行中键入perl --version 。 如果未安装Perl,请参考Perl网站上的安装指南(请参阅参考资料 )。

    在计算机上找到或安装Perl之后,下一步就是确定是否需要安装Perl / Tk模块。 验证是否已安装模块的一种简单方法是在命令提示符下键入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模块的一种方法是使用综合Perl存档网络(CPAN)。 在命令提示符下键入以下内容:

    perl –MCPAN –e shell install Bundle::CPAN reload cpan install Tk

    如果使用Windows,则类似的方法是使用Perl程序包管理器(PPM)。 在命令提示符下,键入ppm以启动GUI并下载Tk模块。

    安装完成后,通过执行perl –e "use Tk"验证Perl是否可以找到该模块。

    创建一个窗口

    现在,计算机已经安装了Perl和Perl / Tk模块,是时候通过该模块编写第一个GUI程序了。 您将从一个简单的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文件。 该行的第二部分( -w )是Perl中的一个有价值的工具:它在执行脚本时启用警告,将发现的任何可能的错误通知最终用户。

    在执行时不应该进行评估的注释和文本的前面加上八角形或#符号:

    # Display Hello World program

    为了使Perl脚本使用Tk模块,必须将其包括在内-换句话说, use Tk 。 将use strict语句添加到Perl脚本中还有助于查找任何可能的错别字或逻辑错误:

    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();

    该行在主窗口内创建一个“关闭”按钮。 通过鼠标单击激活或通过键盘执行时,此按钮退出Perl脚本:

    $mw->Button(-text => "Close", -command =>sub{exit})->pack();

    同样,由于此按钮占用了主窗口上的空间,因此您需要使用pack函数来计算所使用的空间。

    在执行MainLoop之前,将读取,定义脚本中的所有内容,并准备执行它们。 然后,当调用MainLoop时,将执行该点之前读取的所有功能和数据,并显示GUI。

    MainLoop;

    小部件

    本节介绍小部件。 它涵盖了一些基本的小部件,并提供了每个小部件的示例,包括框架,文本,条目,按钮和标签。

    什么是小部件?

    小部件是执行特定功能的图形对象。 Perl / Tk模块中的任何图形对象都可以视为小部件。 当想到GUI应用程序时,按钮,文本,框架和滚动条都是小部件。

    以下小部件示例为本文稍后讨论的小部件奠定了基础。

    框架小部件的确切名称是:框架或盒子。 该框架用于对其他小部件进行分组。

    输入以下脚本:

    #!/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所示。

    图4. Entry小部件示例

    文本小部件和此小部件之间的唯一区别是小部件名称:

    $mw->Entry(-background => 'black', -foreground => 'white')->pack(-side => "top");

    但是,如示例所示,您只能提供一行文本。

    纽扣

    按钮小部件创建一个按钮,当最终用户激活该按钮时,该按钮可以执行功能或命令。 几乎所有图形程序都包含按钮,因此熟悉按钮小部件非常方便。

    下面的示例使用三个按钮。 第一个标为“按钮1”的按钮显示消息“ 按钮1” ,并按“确定”按钮。 第二个标记为Button 2的按钮显示消息Button 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. Button小部件示例
    图6.单击按钮1
    图7.单击按钮2
    图8.未单击任何按钮
    图9.确认没有单击按钮
    图10.单击是按钮
    图11.单击是按钮的确认

    该脚本比前面的示例更复杂,但是,如果将其分解,则跟其他示例一样容易遵循。 首先,创建每个按钮并为其分配适当的文本( 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,并带有标记为OK的单个按钮。 由于没有对“确定”按钮执行任何进一步的评估,因此消息框被破坏,主窗口重新获得焦点。

    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"); } }

    标签

    标签是不可编辑的文本小部件。 在文本框和输入框之前,标签可能很有用。 输入以下示例脚本:

    #!/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.标签小部件示例

    第一行使用文本名称创建标签。 您叫什么名字? :

    $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 => \&copy_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 => \&copy_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");

    您还创建了一个文本小部件,以便用户可以从条目小部件中复制文本并在必要时进行编辑。

    这些函数是clear和copy子例程:

    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 / Tk模块的Perl引入AIX环境可以使开发人员,管理员以及客户或最终用户受益。 您可以将看起来对客户而言乏味的脚本增强为外观专业的GUI应用程序。 挂起这些小部件可能要花一些时间,但是,一旦掌握了这些小部件,就值得付出努力和时间了!


    翻译自: https://www.ibm.com/developerworks/aix/library/au-perltkmodule/index.html

    相关资源:perl/tk常用命令
    Processed: 0.019, SQL: 9