IBM®AIX®操作系统(AIX)管理员和开发人员通常使用Perl语言。 在几乎每个成功的网站和大多数AIX系统上都可以找到Perl。 尽管Perl脚本功能强大,但它们产生的Web界面缺少图形化前端,并迫使用户键入信息而不是使用鼠标,这可能会使客户感到不满意。 通过在Perl中引入Tk模块已经解决了该问题。 管理员或开发人员可以使用Tk模块快速为Perl脚本注入新的活力,并满足客户对X11产品的需求。
如第1部分所述 , 小部件是执行特定功能的图形对象。 Perl / Tk模块中的任何图形对象都可以视为小部件。 在GUI应用程序中,按钮,文本,框架和滚动条都是小部件。 第二篇文章讨论了以下小部件:
单选按钮 复选按钮 菜单 菜单按钮 滚动条pack是最常用的功能之一,也是更复杂的方法之一。 pack功能是Perl / Tk模块中的几何或放置管理器。 当开发人员定义窗口小部件时,只需定义以下内容即可。 在几何管理器正确分配空间之前,不显示该小部件,而这正是pack进入工作的地方。 pack函数计算在窗口小部件的父项上分配的空间并显示窗口小部件。
根据最终用户的需求,一个应用程序可能需要多个窗口。 创建多个窗口很简单。 它扩展了第1部分中使用的方法。 要回答的第一个问题是应用程序是否应同时创建和显示窗口,或者用户的操作是否应触发新窗口的创建和显示。 本节讨论这两种方法。 创建一个同时显示多个窗口的应用程序是创建一个带有TopLevel小部件的窗口的扩展:
#!/usr/bin/perl -w # Create multiple windows at once use Tk; use strict; my $mw = MainWindow->new; $mw->geometry("200x100"); $mw->title("Multiple Windows Test"); my $subwin1 = $mw->Toplevel; $subwin1->title("Sub Window #1"); my $subwin2 = $mw->Toplevel; $subwin2->title("Sub Window #2"); MainLoop;运行脚本将生成图1所示的GUI应用程序。
本文只回顾了代码的第一部分,以便回顾本系列第1部分中讨论的内容。 第一部分(/ usr / bin / perl)定义Perl可执行文件在计算机上的驻留位置,它指示计算机使用Perl可执行文件的此副本来执行文件multi_windows_at_once-demo.pl:
#!/usr/bin/perl -w此行代码的第二部分( -w )是Perl中的重要工具。 它在执行脚本时启用警告,将发现的任何可能的错误通知最终用户。 注释和文本在执行时不进行评估,其前面带有井号( # )。 例如:
# Create multiple windows at once为了使Perl脚本使用Tk模块,必须将其包括在内:因此请use Tk代码。 例如:
use Tk; use strict;将use strict语句添加到Perl脚本中有助于查找拼写错误和逻辑错误。 要创建应用程序的主窗口,请使用MainWindow ,并将其分配给$mw 。 例如:
my $mw = MainWindow->new;$mw充当所有其他小部件的父级,如本文进一步讨论。 将主窗口大小设置为200x100,并为主窗口命名“多窗口测试”。 例如:
$mw->geometry("200x100"); $mw->title("Multiple Windows Test");要在应用程序中创建其他窗口,请使用TopLevel并将其分配给$subwin1 。 例如:
my $subwin1 = $mw->Toplevel; $subwin1->title("Sub Window #1");与创建第一个其他窗口类似,创建另一个窗口并将其分配给$subwin2 。 例如:
my $subwin2 = $mw->Toplevel; $subwin2->title("Sub Window #2");在执行MainLoop之前,将读取,定义脚本中的所有内容,并准备执行它们。 然后,当调用MainLoop时,将执行先前读取的所有功能和数据,并显示GUI。 例如:
MainLoop;创建显示用户触发的其他窗口的应用程序同样容易。 例如:
#!/usr/bin/perl -w # Create a sub window at the request of the user use Tk; use strict; my $mw = MainWindow->new; $mw->geometry("400x100"); $mw->title("Multiple Windows Test"); my $button1 = $mw->Button(-text => "Open new window", -command => \&button1_sub)->pack(-side => "top"); $mw->Button(-text => "Exit", -command => sub{exit})->pack(); sub button1_sub { my $subwin1 = $mw->Toplevel; $subwin1->geometry("300x150"); $subwin1->title("Sub Window #1"); my $subwin_button = $subwin1->Button(-text => "Close window", -command => [$subwin1 => 'destroy'])->pack(); } MainLoop;执行脚本将生成图2所示的GUI应用程序。
执行脚本时,仅显示主窗口。 但是,单击“ 打开新窗口”按钮会创建并显示子窗口(请参见图3)。
首先,创建一个标签为Open new window的按钮,并将其功能分配给子例程button1_sub 。 还创建一个退出按钮,执行该子例程以退出Perl脚本。 例如:
my $button1 = $mw->Button(-text => "Open new window", -command => \&button1_sub)->pack(-side => "top"); $mw->Button(-text => "Exit", -command => sub{exit})->pack();button1_sub子例程使用TopLevel小部件设置大小和标题来创建一个新窗口。 它还创建了一个“ 关闭窗口”按钮,使用户可以销毁子窗口。 例如:
sub button1_sub { my $subwin1 = $mw->Toplevel; $subwin1->geometry("300x150"); $subwin1->title("Sub Window #1"); my $subwin_button = $subwin1->Button(-text => "Close window", -command => [$subwin1 => 'destroy'])->pack(); }本节讨论中间小部件,从逻辑上讲,这是从第1部分中介绍小部件的角度出发。 这些中间小部件包括单选按钮,复选按钮,菜单,菜单按钮和滚动条小部件。
单选按钮小部件显示一个或几个单选按钮。 用户必须在按钮之间做出选择。 下面的示例演示如何将单选按钮小部件引入应用程序。
#!/usr/bin/perl -w # create radio buttons use Tk; use strict; my $mw = MainWindow->new; $mw->geometry("300x100"); $mw->title("Radio Button Test"); my $color = "Red"; my $radio_frame = $mw->Frame()->pack(-side => "top"); $radio_frame->Label(-text=>"My favorite primary color is ")->pack(-side => "left"); my $radio_blue = $radio_frame->Radiobutton(-text => "Blue", -value => "Blue", -variable=> \$color)->pack(-side => "right"); my $radio_yellow = $radio_frame->Radiobutton(-text => "Yellow", -value => "Yellow", -variable=> \$color)->pack(-side => "right"); my $radio_red = $radio_frame->Radiobutton(-text => "Red", -value => "Red", -variable=> \$color)->pack(-side => "right"); my $button_frame = $mw->Frame()->pack(-side => "bottom"); my $button_color = $button_frame->Button(-text => "OK", -command => \&color_sub)->pack(-side => "left"); my $button_exit = $button_frame->Button(-text => "Exit", -command => sub{exit})->pack(-side => "right"); sub color_sub { $mw->messageBox(-message => "You selected $color!", -type => "ok"); } MainLoop;执行脚本将生成图4所示的GUI应用程序。
首先定义变量$color并将其值设置为“ Red”:
my $color = "Red";创建一个框架来容纳单选按钮和标签,使小部件具有干净,对齐,专业的外观。 创建一个标签小部件,以使用户知道程序对他的期望。 例如:
my $radio_frame = $mw->Frame()->pack(-side => "top"); $radio_frame->Label(-text=>"My favorite primary color is ")->pack(-side => "left"); my $radio_blue = $radio_frame->Radiobutton(-text => "Blue", -value => "Blue", -variable=> \$color)->pack(-side => "right"); my $radio_yellow = $radio_frame->Radiobutton(-text => "Yellow", -value => "Yellow", -variable=> \$color)->pack(-side => "right"); my $radio_red = $radio_frame->Radiobutton(-text => "Red", -value => "Red", -variable=> \$color)->pack(-side => "right");创建三个单选按钮小部件,并将它们分配给预定义的变量$color 。 每个单选按钮都有文本和一个分配为颜色的值。 因为您用值“ Red”定义了变量$color ,所以$radio_red小部件是默认值,并将其设置为true。 现在添加第二个框架来容纳窗口的按钮。 在框架内部,创建两个按钮。 第一个标记为OK,并在用户单击按钮时执行子例程color_sub 。 第二个按钮标记为Exit ; 单击后退出程序。 例如:
my $button_frame = $mw->Frame()->pack(-side => "bottom"); my $button_color = $button_frame->Button(-text => "OK", -command => \&color_sub)->pack(-side => "left"); my $button_exit = $button_frame->Button(-text => "Exit", -command => sub{exit})->pack(-side => "right");以下子例程显示一个消息框,通知用户他们选择了哪种颜色。 当他们单击OK时 ,消息框被破坏。 例如:
sub color_sub { $mw->messageBox(-message => "You selected $color!", -type => "ok"); }复选框小部件显示一个或多个复选框。 用户可以选择其中一个或多个。 以下示例说明了使用checkbutton小部件:
#!/usr/bin/perl -w use Tk; use strict; my $mw = MainWindow->new; $mw->geometry("300x150"); $mw->title("Check Button Test"); my $check1 = 'NOT CHECKED'; my $check2 = 'NOT CHECKED'; my $check3 = 'NOT CHECKED'; my $check_frame = $mw->Frame()->pack(-side => "top"); $check_frame->Label(-text=>"Select some check buttons.")->pack(-side => "top")->pack(); my $chk1 = $check_frame->Checkbutton(-text => 'Check #1', -variable => \$check1, -onvalue => 'CHECKED', -offvalue => 'NOT CHECKED')->pack(); my $chk2 = $check_frame->Checkbutton(-text => 'Check #2', -variable => \$check2, -onvalue => 'CHECKED', -offvalue => 'NOT CHECKED')->pack(); my $chk3 = $check_frame->Checkbutton(-text => 'Check #3', -variable => \$check3, -onvalue => 'CHECKED', -offvalue => 'NOT CHECKED')->pack(); my $button_frame = $mw->Frame()->pack(-side => "bottom"); my $ok_button = $button_frame->Button(-text => 'OK', -command => \&check_sub)->pack(-side => "left"); my $exit_button = $button_frame->Button(-text => 'Exit', -command => sub{exit})->pack(-side => "right"); sub check_sub { my $check_msg = "Check #1: $check1\nCheck #2: $check2\nCheck #3: $check3"; $mw->messageBox(-message => "Check Button Summary:\n$check_msg", -type => "ok"); } MainLoop;执行该脚本将生成图5所示的GUI应用程序。
首先,为复选按钮定义三个变量,并将默认值设置为“ NOT CHECKED”。 例如:
my $check1 = 'NOT CHECKED'; my $check2 = 'NOT CHECKED'; my $check3 = 'NOT CHECKED';接下来,创建一个框架来组织标签小部件和复选按钮小部件。 还要创建标签并包装,将其与框架顶部对齐。 例如:
my $check_frame = $mw->Frame()->pack(-side => "top"); $check_frame->Label(-text=>"Select some check buttons.")->pack(-side => "top")->pack();创建三个标记为Check#1 , Check#2和Check#3的复选框 。 给它们分配预定义的变量$check1到$check3 ,并设置onvalue和offvalue属性以向用户显示适当的文本。 例如:
my $chk1 = $check_frame->Checkbutton(-text => 'Check #1', -variable => \$check1, -onvalue => 'CHECKED', -offvalue => 'NOT CHECKED')->pack(); my $chk2 = $check_frame->Checkbutton(-text => 'Check #2', -variable => \$check2, -onvalue => 'CHECKED', -offvalue => 'NOT CHECKED')->pack(); my $chk3 = $check_frame->Checkbutton(-text => 'Check #3', -variable => \$check3, -onvalue => 'CHECKED', -offvalue => 'NOT CHECKED')->pack();创建第二个框架来组织按钮。 在此框架中创建两个按钮。 第一个标记为OK ,将触发子例程check_sub 。 第二个执行子例程以退出Perl脚本。 例如:
my $button_frame = $mw->Frame()->pack(-side => "bottom"); my $ok_button = $button_frame->Button(-text => 'OK', -command => \&check_sub)->pack(-side => "left"); my $exit_button = $button_frame->Button(-text => 'Exit', -command => sub{exit})->pack(-side => "right");子例程check_sub定义了一个名为$check_msg ,其中包含每个检查按钮的状态,并使用messageBox小部件将输出显示到变量$check_msg 。 例如:
sub check_sub { my $check_msg = "Check #1: $check1\nCheck #2: $check2\nCheck #3: $check3"; $mw->messageBox(-message => "Check Button Summary:\n$check_msg", -type => "ok"); }菜单小部件是一种在单个干净列中显示项目的简便方法。 大多数复杂的GUI应用程序都包含某种形式的菜单,该菜单可能仅包含退出功能或20个选择。 以下脚本演示了创建菜单有多么容易:
#!/usr/bin/perl -w use Tk; use strict; my $mw = MainWindow->new; $mw->geometry("300x150"); $mw->title("Menu Test"); my $main_menu = $mw->Menu(); $mw->configure(-menu => $main_menu); my $file_menu = $main_menu->cascade(-label=>"File", -underline => 0, -tearoff=>0); $file_menu->command(-label=>"Exit", -underline=>0, -command=>sub{exit}); $main_menu->command(-label=>"Say Hello", -underline => 0, -command=>sub{$mw->messageBox(-message=>"Hello!", -type => "ok")}); MainLoop;执行脚本将生成图6所示的GUI应用程序。
创建菜单小部件,并开始对其进行配置,为菜单项做准备。 例如:
my $main_menu = $mw->Menu(); $mw->configure(-menu => $main_menu);现在,创建一个文件菜单。 例如:
my $file_menu = $main_menu->cascade(-label=>"File", -underline => 0, -tearoff=>0);在文件菜单下创建一个退出命令,并带有一个子例程以退出脚本。 例如:
$file_menu->command(-label=>"Exit", -underline=>0, -command=>sub{exit});创建另一个菜单,并将其标记为Say Hello 。 例如:
$main_menu->command(-label=>"Say Hello", -underline => 0, -command=>sub{$mw->messageBox(-message=>"Hello!", -type => "ok")});代替在该菜单下包括命令,而是在菜单本身上配置命令。 当您选择此菜单时,将出现一个消息框,显示“ Hello!”。 menubutton小部件与菜单小部件相似,但是它包含一种显示与菜单关联的文本或图像的方法。 以下示例描述了如何将menubutton小部件添加到应用程序中以及如何为命令添加一些颜色。
#!/usr/bin/perl -w use Tk; use strict; my $mw = MainWindow->new; $mw->geometry("300x150"); $mw->title("Menubutton Test"); my $main_menu = $mw->Menu(); $mw->configure(-menu => $main_menu); my $btn = $main_menu->Menubutton(-text => "Colorful Buttons...", -underline => 0, -tearoff=>0); $btn->command(-label => "Button #1", -activebackground => "blue", -foreground => "blue", -command => sub{$mw->messageBox(-message => "Button #1 Pressed")}); $btn->command(-label => "Button #2", -activebackground => "red", -activeforeground => "black", -background => "yellow", -foreground => "green", -command => sub{$mw->messageBox(-message => "Button #2 Pressed")}); $btn->command(-label => "Exit", -command => sub{exit}); MainLoop;运行脚本将生成图7、8和9所示的GUI应用程序。
首先,创建menubutton小部件,并准备向其添加命令。 例如:
my $btn = $main_menu->Menubutton(-text => "Colorful Buttons...", -underline => 0, -tearoff=>0);现在在$ btn菜单按钮上创建三个命令。 例如:
$btn->command(-label => "Button #1", -activebackground => "blue", -foreground => "blue", -command => sub{$mw->messageBox(-message => "Button #1 Pressed")}); $btn->command(-label => "Button #2", -activebackground => "red", -activeforeground => "black", -background => "yellow", -foreground => "green", -command => sub{$mw->messageBox(-message => "Button #2 Pressed")}); $btn->command(-label => "Exit", -command => sub{exit});第一个命令具有蓝色前景:当命令未突出显示时,背景仍然是默认的带有蓝色文本的灰色。 该命令还具有活动的蓝色背景:突出显示该命令时,背景变为蓝色,而文本仍为默认的灰色。 激活菜单按钮后,将出现一个消息框,指出已单击该按钮。 选中后,第二个命令将执行类似的操作。 但是,活动背景为红色,活动前景为黑色,背景为黄色,前景为绿色。 第三个命令退出脚本。
滚动条小部件控制其他小部件的视图,例如文本和输入小部件。 添加此窗口小部件可使用户使用滚动条上下移动目标窗口小部件。 将滚动条小部件添加到应用程序既快速又简单。 例如:
#!/usr/bin/perl -w use Tk; use strict; my $mw = MainWindow->new; $mw->geometry("200x100"); $mw->title("Scrollbar Test"); my $scroll_text = $mw->Scrollbar(); my $main_text = $mw->Text(-yscrollcommand => ['set', $scroll_text], -background => 'black', -foreground => 'red'); $scroll_text->configure(-command => ['yview', $main_text]); $scroll_text->pack(-side=>"right", -expand => "no", -fill => "y"); $main_text->pack(-side => "left", -anchor => "w", -expand => "yes", -fill => "both"); MainLoop;运行脚本将生成图10所示的GUI应用程序。
首先创建滚动条小部件。 例如:
my $scroll_text = $mw->Scrollbar();创建具有默认颜色以外的颜色的文本窗口小部件,并将滚动条窗口小部件($ scroll_text)绑定为应用程序y(垂直)轴上的scrollcommand。 例如:
my $main_text = $mw->Text(-yscrollcommand => ['set', $scroll_text], -background => 'black', -foreground => 'red');通过移动滚动条以控制目标小部件的移动,允许用户与滚动条小部件进行交互。 例如:
$scroll_text->configure(-command => ['yview', $main_text]);打包文本小部件和滚动条小部件,将它们很好地定位。 例如:
$scroll_text->pack(-side=>"right", -expand => "no", -fill => "y"); $main_text->pack(-side => "left", -anchor => "w", -expand => "yes", -fill => "both");现在,您将几个中间小部件放在一个脚本中。 例如:
#!/usr/bin/perl -w use Tk; use strict; my $ver = "1.0.0"; my $mw = MainWindow->new; $mw->geometry("500x150"); $mw->title("All-In-One Demo #2"); my $main_menu = $mw->Menu(); $mw->configure(-menu => $main_menu); # give the user a way to exit the script my $file_menu = $main_menu->cascade(-label=>"File", -underline => 0, -tearoff=>0); $file_menu->command(-label=>"Exit", -underline=>0, -command => sub{exit}); # everyone needs a little help my $help_menu = $main_menu->cascade(-label => "Help", -underline => 0, -tearoff => 0); $help_menu->command(-label => "Version", -underline => 0, -command => sub{$mw->messageBox(-message => "Version: $ver", -type => "ok")}); $help_menu->command(-label => "About Program", -underline => 0, -command => \&show_about); my $greeting_frame = $mw->Frame()->pack(-side => "top"); $greeting_frame->Label(-text => "Tell me a little about yourself...")->pack(); my $info_frame = $mw->Frame()->pack(-side => "top"); my $last_name = $info_frame->Entry()->pack(-side => "right"); $info_frame->Label(-text => "Last Name")->pack(-side => "right"); my $stat = "Mr"; $info_frame->Radiobutton(-text => "Mr", -value => "Mr", -variable => \$stat)->pack(-side => "right"); $info_frame->Radiobutton(-text => "Mrs", -value => "Mrs", -variable => \$stat)->pack(-side => "right"); $info_frame->Radiobutton(-text => "Miss", -value => "Miss", -variable => \$stat)->pack(-side => "right"); my $pet_info_frame = $mw->Frame()->pack(-side => "top"); $pet_info_frame->Label(-text => "Check all pets you like?")->pack(-side => "left"); my $chk1 = "no"; my $chk2 = "no"; my $chk3 = "no"; my $chk4 = "no"; my $chk5 = "no"; my $pet1_chk = $pet_info_frame->Checkbutton(-text => "Cat", -variable => \$chk1, -onvalue => "yes", -offvalue => "no")->pack(-side => "right"); my $pet2_chk = $pet_info_frame->Checkbutton(-text => "Dog", -variable => \$chk2, -onvalue => "yes", -offvalue => "no")->pack(-side => "right"); my $pet3_chk = $pet_info_frame->Checkbutton(-text => "Fish", -variable => \$chk3, -onvalue => "yes", -offvalue => "no")->pack(-side => "right"); my $pet4_chk = $pet_info_frame->Checkbutton(-text => "Snake", -variable => \$chk4, -onvalue => "yes", -offvalue => "no")->pack(-side => "right"); my $pet5_chk = $pet_info_frame->Checkbutton(-text => "Hamster", -variable => \$chk5, -onvalue => "yes", -offvalue => "no")->pack(-side => "right"); my $button_frame = $mw->Frame()->pack(-side => "top"); $button_frame->Button(-text => "Ok", -command => \&update_output)->pack(); my $output_frame = $mw->Frame()->pack(-side => "bottom"); my $output_scroll = $output_frame->Scrollbar(); my $output_text = $output_frame->Text(-yscrollcommand => ['set', $output_scroll]); $output_scroll->configure(-command => ['yview', $output_text]); $output_scroll->pack(-side => "right", -expand => "no", -fill => "y"); $output_text->pack(); sub update_output { my $lname = $last_name->get(); if ($lname eq "") { $lname = "No Name"; } my $output = "Hello $stat. $lname!\nI like the following too!"; if ( $chk1 eq "yes" ) { $output = "$output\nCats"; } if ( $chk2 eq "yes" ) { $output = "$output\nDogs"; } if ( $chk3 eq "yes" ) { $output = "$output\nFish"; } if ( $chk4 eq "yes" ) { $output = "$output\nSnakes"; } if ( $chk5 eq "yes" ) { $output = "$output\nHamsters"; } $output_text->delete('0.0', 'end'); $output_text->insert("end", $output); } sub show_about { my $help_win = $mw->Toplevel; $help_win->geometry("300x50"); $help_win->title("About Program"); my $help_msg = "This help page is an example of using multiple windows."; $help_win->Label(-text => $help_msg)->pack(); $help_win->Button(-text => "Ok", -command => [$help_win => 'destroy'])->pack(); } MainLoop;运行脚本将生成GUI应用程序,如图11所示。
将带有Perl / Tk模块的Perl引入AIX环境可以使开发人员,管理员和最终用户受益。 最初可以让客户觉得乏味的脚本可以增强为外观专业的GUI应用程序。 挂起这些小部件可能要花一些时间,但是一旦您掌握了这些小部件,您就会同意结果值得付出努力和时间!
翻译自: https://www.ibm.com/developerworks/aix/library/au-perltkmodule2/index.html
相关资源:第三方插件