perl/tk 教 程

perl/tk 教 程

浦绍忠
前言
perl/tk 在图形界面、表框设计、菜单设计等方面功能强大,对字体、颜色
和绑定使用灵活,容易上手。
本教程写作原则:
简洁明了地介绍 perl/tk 的功能及其使用, 对功能的使用一般只介绍一种
方法, 其余方法由读者自己实践。对于perl/tk的常用功能及其使用给以相应的
例子,为突出选项的作用,在例子中有时不是遵循美学原则,得到漂亮的界面,
而是使用一些夸张的选项值。
教程的介绍对象是 perl/tk 402.002 版本, 使用Windows 序列操作系统,
本教程中全部例子都在 Windows95,Windows98 下试验通过。
讲解 perl/tk 基本组件,基本使用方法,对 perl/tk 的扩展模块不作说明,
由读者自己去学习掌握。假定读者已掌握 perl 基础知识,对例子中用到的perl
基础知识不作讲解。
第一章 perl/tk 概要说明
一。perl/Tk的取得
从多个网站上可以取得perl/Tk, perl/Tk的安装需要C++的编译器。
Gurusamy Sarathy 已经为使用 Intel 芯片的机器在 NT 上安装了最常用模块的
tar 文件,压缩文件大约有6M,安装后大约有24M,安装后就可以在 Windows 系
列系统下使用 Perl/Tk。为便于下载,你可以从国内网站"http://ftp.freesoft.
cei.gov.cn/pub/languages/perl/CPAN/modules/by-authors/id/GSAR/"取得
Gurusamy Sarathy 安装好的 perl5.00402-bindist04-bc.zip文件。 解压,然后
安装后即可使用(不需要自己用C++编译器进行编译)。
二。perl/tk描述
perl/tk--用perl5写tk程序, perl/tk是GUI类程序,即事件驱动程序。GUI
主循环在用户程序之外, 在GUI库内,该主循环监视所有“感兴趣”事件,激活
相应程序处理这些事件, 这些处理程序可以由用户提供,也可以是GUI库的一个
部分。
不需要编程人员时刻注视着正在发生的事件,而是当工具包需要的时候再动
作,也不需要等待着“打开窗口/关闭窗口/重画窗口”这些请求,而是告诉工具
包哪个过程处理这些请求,当需要的时候工具包再调用所需过程。
程序要求:
perl/tk 程序需要 use Tk 语句,有必要包含 use strict 语句和 -w 开关
以避免公共错误。
任何 tk 应用都需要首先创建 tk 主窗口,然后创建窗口内的项目或者新窗
口,最后创建主循环(当然也可以在运行时创建更多的项目和窗口)。当包装项
目时, 它们显现出来。然后执行 tk 主循环,这将启动 GUI 和处理应用中的所
有事件。
创建主窗口使用:
$mw = new MainWindow; 或者 $mw = MainWindow ->; new;
项目创建
tk 窗口和组件是分层结构的,它们互不包含。
创建组件使用:
$widget = $parent ->; widgetclass(?-option =>; value,...?);
widgetclass 是需要创建的新组件类(例如,Button),$parent 是父组件
的perl/Tk 指针, 新建组件的对象指针储存在 $widget 中, $widget 成为 $
parent的一个子件,它创建分层组件。
以下语句创建一个按钮组件 $b ,并用包装方法将它显示出来。
$b = $mw ->; Button(-text =>; "hello world"->;pack;
所有组件创建命令能够使用 选项 =>;资源参数 形式将资源数据库同组件联
系起来。
选项以“-” 开始, 通常跟一个数值:一个整数、或者一个字符串是一个
perl 标量、 数组、哈希数组或者代码指针。创建后,可以用配置方法改变选项
值。配置方法的一般形式:
$widget = configure(-option =>; value,...);
用 cget 命令查询选项的当前配置值:
$widget = cget(-option);
exam1.pl 显示一个窗口
#####exam1.pl
#! /usr/bin/perl5 -w
use strict;
use Tk;
my $main = new MainWindow;
$main->;Label(-text =>; 'Hello, world!')->;pack;
$main->;Button(-text =>; 'Quit',
-command =>; sub{exit}
)->;pack;
MainLoop;
exam1.pl 中创建了主窗口和项目,并对项目进行了包装。
在 tk 句柄上使用构造器方法,能在窗口或组件内创建子项目。构造方法中
能指定各种选项;之后能用 configure 方法增加或改变选项。Toplevel 构造器
方法创建一个顶层窗口,是分层结构的一个例外。
在 exam1.pl 中,使用 new MainWindow 语句创建第一个 tk 窗口,返回一
个窗口句柄,赋给 $main 变量。从 ¥main 用 Label 方法在主窗口中创建了一
个标签组件。
创建组件后, 需要对它进行包装,如果不再需要该组件,可以用 destrory
方法删除它,删除后将取消组件和它的一切子件的映射。注意,复合调用得到包
装结果而非一个有效的tk句柄。
标准 tk 组件类型:
Button 按钮
Radiobutton 收音机按钮
Checkbutton 检查按钮
Listbox 列表框
Scrollbar 滚动杆
Entry 条目
Text 文本框
Canvas 画布
Frame 框架
Toplevel 顶层窗口
Scale 刻度盘
Menu 菜单
Menubutton 菜单按钮
变量和回调程序
回调是一个标量、一个代码指针或者是表现为一个字符串的方法,第一个元
素作为代码指针或者方法,其余元素作为子过程参数。形式为:
verb++&subroutine [verb++&subroutine ?,args?]
sub... [sub...?,args?]
'methodname' ['methodname' ?,args?]
大部分图形界面用来建立数值和情况集,执行合适的动作。 tk 工具包与文
本方式提示或菜单驱动系统不同,不需要用户亲自收集设置,不需要根据输入代
码决定动作;而是将这些数值留给工具包,仅当动作执行时使用它们。
所以,一个传统的文本方式系统可能象这样:
#! /usr/bin/perl5 -w
use strict;
print "lease type a font name\n";
my $font = <>;; chop $font;
# Validate font
print "lease type a file name\n";
my $filename = <>;; chop $filename;
# Validate filename
print "Type <1>; to fax, <2>; to print\n";
my $option = <>;; chop $option;
if ($option eq 1) {
print "Faxing $filename in font $font\n";
} elsif ($option eq 2) {
print "Now sending $filename to printer in font $font\n";
}
exam2.pl 例子用 tk 做以上工作。 请注意回调的使用,注意 tk 如何处理
这些数值,注意用于处理这些数值的子过程。如果用户想改变 font ,用户程序
将不会知道,它完全由 tk 来处理。
exam2.pl 使用回调
######exam2.pl
#! /usr/bin/perl5 -w
use strict;
use Tk;
my $main = new MainWindow;
$main->;Label(-text =>; 'Print file')->;pack;
my $font = $main->;Entry(-width =>; 10);
$font->;pack;
my $filename = $main->;Entry(-width =>; 10);
$filename->;pack;
$main->;Button(-text =>; 'Fax',
-command =>; sub{do_fax($filename, $font)}
)->;pack;
$main->;Button(-text =>; 'Print',
-command =>; sub{do_print($filename, $font)}
)->;pack;
MainLoop;
sub do_fax {
my ($file, $font) = @_;
my $file_val = $file->;get;
my $font_val = $font->;get;
print "Now faxing $file_val in $font_val\n";
}
sub do_print {
my ($file, $font) = @_;
$file = get $file;
$font = get $font;
print "Sending file $file to printer in $font\n";
}
包装、分组和框架
在上面例子中,已经看到包装调用,这是 tk 中比较复杂的一个部分。它的
基本思想是任何窗口或组件必须受一个 tk 布局管理器控制;包装器是最有用
的布局管理器。
包装器的行为很简单:应用到一个组件时,包装器将该组件放置在父组件的
剩余空间。默认情况,在顶部;下一项目放置在下面。也能够指定左边,右边或
者底部位置。指定位置使用 -side=>;'right'.
其它的包装参数用于指定当框架中还有剩余空间或者窗口增大时组件的行为,
什么都不指定,组件大小将保持不变,这是默认情况。如果希望组件填满当前
水平空间,使用 -fill =>; 'x'、'y' 或者 'both';如果希望组件成长,使用-
expand =>; 'yes'。
在一个窗口内,如果希望一组项目具有不同于其它项目的包装次序,可以用
将它们单独放在一个框架内的方法来实现。
exam3.pl 使用框架
#####exam3.pl
#! /usr/bin/perl5 -w
use strict;
use Tk;
# Take top, the bottom ->; now implicit top is in the middle
my $main = new MainWindow;
$main->;Label(-text =>; 'At the top (default)')->;pack;
$main->;Label(-text =>; 'At the bottom')->;pack(-side =>; 'bottom');
$main->;Label(-text =>; 'The middle remains')->;pack;
# Since left and right are taken, bottom will not work...
my $top1 = $main->;Toplevel;
$top1->;Label(-text =>; 'Left')->;pack(-side =>; 'left');
$top1->;Label(-text =>; 'Right')->;pack(-side =>; 'right');
$top1->;Label(-text =>; '?Bottom?')->;pack(-side =>; 'bottom');
# But when you use frames, things work quite alright
my $top2 = $main->;Toplevel;
my $frame = $top2->;Frame;
$frame->;pack;
$frame->;Label(-text =>; 'Left2')->;pack(-side =>; 'left');
$frame->;Label(-text =>; 'Right2')->;pack(-side =>; 'right');
$top2->;Label(-text =>; 'Bottom2')->;pack(-side =>; 'bottom');
MainLoop;
多个窗口
有的应用需要多个窗口。使用 Toplevel 方法创建顶层窗口,顶层窗口互相
独立,退出一个顶层窗口不影响其它窗口,退出主窗口将结束整个应用。
exam4.pl 显示三个窗口
#####exam4.pl
#! /usr/bin/perl5 -w
use strict;
use Tk;
my $main = new MainWindow;
fill_window($main, 'Main');
my $top1 = $main->;Toplevel;
fill_window($top1, 'First top-level');
my $top2 = $main->;Toplevel;
fill_window($top2, 'Second top-level');
MainLoop;
sub fill_window {
my ($window, $header) = @_;
$window->;Label(-text =>; $header)->;pack;
$window->;Button(-text =>; 'close',
-command =>; sub{destroy $window}
)->;pack(-side =>; 'left');
$window->;Button(-text =>; 'exit',
-command =>; sub{exit}
)->;pack(-side =>; 'right');
}
多个回调
直到现在,例子中的回调过程都是用户程序,也可以是一个 Tk 过程。滚动
杆的运行方式: 当滚动杆的位置改变时,它可以调用一个 Tk 项目或者一个用


过程。 附带滚动杆的 Tk 项目,当它的大小或者位置改变时, 它移动滚动杆。
用这种方式, Tk 项目就连接起来了。你可以查询滚动杆的位置,或者手动调整
滚动杆。
exam5.pl 显示一个带滚动杆的列表框, 移动滚动杆引起列表框移动,浏览
列表框引起滚动杆移动。
exam5.pl 带滚动杆的列表框
#####exam5.pl
#! /usr/bin/perl5 -w
use strict;
use Tk;
my $main = new MainWindow;
my $box = $main->;Listbox(-relief =>; 'sunken',
-width =>; -1, # Shrink to fit
-height =>; 5,
-setgrid =>; 'yes');
my @items = qw(One Two Three Four Five Six Seven
Eight Nine Ten Eleven Twelve);
foreach (@items) {
$box->;insert('end', $_);
}
my $scroll = $main->;Scrollbar(-command =>; ['yview', $box]);
$box->;configure(-yscrollcommand =>; ['set', $scroll]);
$box->;pack(-side =>; 'left', -fill =>; 'both', -expand =>; 'yes');
$scroll->;pack(-side =>; 'right', -fill =>; 'y');
MainLoop;
画布和标签
画布窗口是 Tk 中一个能力很强的窗口类型。在画布窗口中,可以包含图形
和其它组件。画布区域可以大于可见窗口,能够滚动。画布上的项目有它自己的
身份号,可选择性地有一个或者多个标签,可以用身份号指代项目,也可用共同
标签指代一组项目,可以用这些标签移动,删除或者改变一组项目,能将动作绑
定在标签上。恰当地设计画布(通常结构化的),能够简单地实现较强功能。
在 exam6.pl 中,动作绑定在圆(单击)和蓝色项目(双击)上;显然,这
种绑定也能够扩展到任意标签和任意组标签上。
exam6.pl 使用画布
#####exam6.pl
#! /usr/bin/perl5 -w
use strict;
use Tk;
# Create main window and canvas
my $main = new MainWindow;
my $canvas = $main->;Canvas;
$canvas->;pack(-expand =>; 'yes', -fill =>; 'both');
# Create various items
create_item($canvas, 1, 1, 'circle', 'blue', 'Jane');
create_item($canvas, 4, 4, 'circle', 'red', 'Peter');
create_item($canvas, 4, 1, 'square', 'blue', 'James');
create_item($canvas, 1, 4, 'square', 'red', 'Patricia');
# Single-clicking with left on a 'circle' item invokes a procedure
$canvas->;bind('circle', '<1>;' =>; sub {handle_circle($canvas)});
# Double-clicking with left on a 'blue' item invokes a procedure
$canvas->;bind('blue', '' =>; sub {handle_blue($canvas)});
MainLoop;
# Create an item; use parameters as tags (this is not a default!)
sub create_item {
my ($can, $x, $y, $form, $color, $name) = @_;
my $x2 = $x + 1;
my $y2 = $y + 1;
my $kind;
$kind = 'oval' if ($form eq 'circle');
$kind = 'rectangle' if ($form eq 'square');
$can->;create(($kind, "$x" . 'c', "$y" . 'c',
"$x2" . 'c', "$y2" . 'c'),
-tags =>; [$form, $color, $name],
-fill =>; $color);
}
# This gets the real name (not current, blue/red, square/circle)
# Note: you'll want to return a list in realistic situations...
sub get_name {
my ($can) = @_;
my $item = $can->;find('withtag', 'current');
my @taglist = $can->;gettags($item);
my $name;
foreach (@taglist) {
next if ($_ eq 'current');
next if ($_ eq 'red' or $_ eq 'blue');
next if ($_ eq 'square' or $_ eq 'circle');
$name = $_;
last;
}
return $name;
}
sub handle_circle {
my ($can) = @_;
my $name = get_name($can);
print "Action on circle $name...\n";
}
sub handle_blue {
my ($can) = @_;
my $name = get_name($can);
print "Action on blue item $name...\n";
}
第二章 perl/Tk 组件标准选项
为便于学习掌握, 将 perl/Tk 标准选项集中在此统一介绍。使用屏幕单位
的选项,取值为:不带单位字母时为像素,单位字母为--c(厘米) ,i(英寸),m
(毫米),p(点)。
-activebackground =>; color
指定激活组件的背景颜色。
-activeborderwidth =>; width
指定激活组件的宽度,使用屏幕单位。
-activeforeground =>; color
指定激活组件的前景颜色。
-anchor =>; anchorPos
组件的布局位置,有效值为:n, ne, e, se, s, sw, w, nw 和 center。
-background =>; color
组件处于正常状态时的背景颜色。
-bitmap =>; bitmap
指定显示在组件中的位图 ( error, gray12, gray25, gray50, gray75,
hourglass,info, questhead, question, warning, @pathName)。
-borderwidth =>; width
组件处于正常状态时的边界宽度,使用屏幕单位。
-command =>; callback
指定唤醒组件时所运行 Perl/Tk 回调过程。
-cursor =>; [bitmap, mask, foreground, background]
描述当鼠标指针指向组件时,光标显示状态的一个数组指针。
-disabledforeground =>; color
组件处于无效状态时的前景颜色。
-exportselection =>; boolean
指定组件的选择是否是 X 方向选择。选项取值为 true,false,0,1,yes和no。
如果选择已经导出,组件内的选择将取消当前选择,组件外的选择将取消任何组
件选择,当组件有选择时,组件响应选择。组件的默认情况是导出选择。
-font =>; font
组件中文本使用的字体。
-foreground =>; color
组件处于正常状态时的前景颜色。
-highlightbackground =>; color
指定组件不具有输入聚焦时它周围矩形框的颜色。
-highlightcolor =>; color
指定组件具有输入聚焦时它周围矩形框的颜色。
-highlightthickness =>; width
指定组件具有输入聚焦时它周围矩形框的宽度,使用屏幕单位。
-image =>; image
指定显示在组件中的图像(细节请看图像一章)。
-insertbackground =>; color
指定插入光标覆盖区域的背景颜色。
-insertborderwidth =>; width
指定插入光标边界的宽度,使用屏幕单位。
-insertofftime =>; milliseconds
指定在每一 了 循环中插入光标保持“off”状态的时间,单位千分秒。
-insertontime =>; milliseconds
指定在每一 了 循环中插入光标保持“on”状态的时间,单位千分秒。
-insertwidth =>; width
指定插入光标的宽度,使用屏幕单位。
-jump =>; boolean
指定附着在组件上的滚动杆和刻度盘是否延迟到鼠标键松开时才更新。
-justify =>; left center right
指定多线条排列时的对齐方式。 left,线条左对齐; center,线条居中对
齐;right,线条右对齐;
-orient =>; horizontal vertical
指定组件的布局方向,例如滚动杆可以水平布局,也可以纵向布局。
-padx =>; width
在 X 方向组件所需要的额外空间, 使用屏幕单位。计算所需空间时,组
件将这个数值加在正常情况所需的空间数值(由显示在组件中物件的宽度决定)
上;如果几何管理器能满足这个要求,组件将额外的内部空间用于它的左边或者
右边。大多数组件只将这个选项用于填充文本:当显示位图或图像时,忽略该选
项。
-pady =>; height
在 Y 方向组件所需要的额外空间,使用屏幕单位。解释参看上一条。
-relief =>; flat groove raised ridge sunken
指定组件边框的3-D效果。 flat, 扁平; groove,凹槽;raised,凸起;
ridge,山脊; sunken,下凹的。
-repeatdelay =>; milliseconds
必须在自动重复的多少时间前,按下一个按钮或按键才有效,单位千分秒。
-repeatinterval =>; milliseconds
动作开始后,自动重复之间的间隔时间,单位千分秒。
-selectbackground =>; color
指定选择项目的背景颜色。
-selectborderwidth =>; width
指定选择项目的宽度,使用屏幕单位。
-selectforeground =>; color
指定选择项目的前景颜色。
-setgrid =>; boolean
这个组件是否控制它的顶层窗口的调整网格。这个选项用于文本组件时很典
型,组件中的信息有天然尺寸(一个字符的尺寸),这个天然的尺寸组成一个网
格,这个选项负责使窗口的容积成为网格的整数倍。如果选项为真时,组件同窗
口管理器进行通信,当用户调整包含该组件的顶层窗口时,窗口容积以网格为单
位显示,窗口尺寸紧缩为网格单位的整数倍。
-state =>; actived normal disabled (用于按钮类组件)
指定组件的当前状态。
-takefocus =>; focusType
提供通过键盘遍历窗口(例如,Tab和Shift+Tab)时窗口的聚焦信息。在给
一个窗口设置聚焦前, 遍历脚本首先检查窗口是否可见 ;如果不可见,跳过该
窗口。 其次,检查 takefocus 选项值。如果是0,组件永远不聚焦;1,组件经
常聚焦;如果是一个空值,由 Tk 决定该窗口是否聚焦:如果窗口处于无效状态
或者没有键绑定事件则跳过该窗口; 其余情况,将 focusType 作为一个回调执
行,将组件指针作为第一表达式,返回值必须是0,1或者一个空字符串。 注意:
该解释完全由运行遍历的回调脚本定义,组件的运用完全忽略该选项,重新定义
键盘遍历脚本可以改变它的含义。
-text =>; string
指定显示在组件中的文本。
-textvariable =>; varRef
指定变量。该变量的值是显示在组件内的一个字符串;如果变量值改变,组
件自动更新以反映新值。 字符串在组件中的显示方式依赖于特定组件和受例如
anchor 和 justify 等选项决定。
-troughcolor =>; color
指定滚动杆和刻度盘等组件中可移动的矩形区域的颜色。
-underline =>; index
指定组件中用作索引的字母,该字母下划线。该选项被用于运行菜单按钮和
按钮输入遍历的默认绑定使用。0对应组件中文本的第一个字母,1对应下一个字
母,等等。
-wraplength =>; length
指定整字换行情形时的最大行长度。一行上超过该长度的部分换行到第二行。
使用屏幕单位。长度小于或等于0,不换行,仅在遇到换行符时才另起一行。
-xscrollcommand =>; callback
指定用于同水平滚动杆通信的子过程和参数。
-yscrollcommand =>; callback
指定用于同纵向滚动杆通信的子过程和参数。
exam7.pl 使用标准选项
#####exam7.pl
use Tk;
$main=new MainWindow;
$main->;Label(-text=>;'example',-background=>;'pink1')->;pack;
$main->;Button(-text=>;'input',
-activebackground=>;'red',
-activeforeground=>;'white',
-background=>;'yellow',
-borderwidth=>;5,
-underline=>;0
)->;pack;
$main->;Button(-text=>;'output',
-activebackground=>;'red',
-activeforeground=>;'white',
-background=>;'yellow',
-borderwidth=>;5,
-padx=>;'1c',
-pady=>;100,
-takefocus=>;'0',
-underline=>;1
)->;pack;
$main->;Button(-text=>;'ok',
-activebackground=>;'red',
-activeforeground=>;'white',
-background=>;'yellow',
-borderwidth=>;5,
-command=>;sub{prnt($varible)},
-underline=>;0
)->;pack;
MainLoop;
sub prnt {
$varible=shift;
print "$varible\n";
sleep(1);
exit;
}
第三章 Perl/Tk 特殊变量
$Tk::library
包含模板,组件和脚本库的目录。
$Tk::patchLevel
以整数显示Tcl/Tk的当前补丁级别。
$Tk::strictMotif
非0时,Tk 尽可能地粘附于主题上。
$Tk::version
Perl/Tk 所居于的 Tcl/Tk 的当前版本,用主.次形式表示。
$Tk::VERSION
Perl/Tk 的当前版本。
exam8.pl Perl/Tk 特殊变量的使用例子
#####exam8.pl
use Tk;
print"$Tk::library\n";
print"$Tk::patchLevel\n";
print"$Tk::strictMotif\n";
print"$Tk::version\n";
print"$Tk::VERSION\n";
第四章 pack - 包装洞穴边缘的几何管理器
包装方法用于同包装器进行通信,包装器是一个将组件按次序包装在父件边
缘周围的几何管理器。
一般情形一次只包装一个组件。
-after =>; other
other 必须是一个其它窗口。 用 other 窗口的父件作当前组件的父件,在
包装次序中将当前组件插在 other 窗口之后。
-anchor =>; anchor
指定组件的布局方式,例如 n 或者 sw,默认为中间。
-before =>; other
other 必须是一个其它窗口。 用 other 窗口的父件作当前组件的父件,在
包装次序中将当前组件插在 other 窗口之前。
-expand =>; boolean
指定组件是否扩展以占用父件的额外空间。 使用适当的布尔值,例如1或者
no,默认情形为0。
-fill =>; style
如果组件的部分比所要求的容积大,可用这个选项伸展组件。Style 的值必
须是以下情形之一:
none
给组件以要求的容积加上用 -ipadx 或者 -ipady 所要求的内部填充值,这
是默认行为。
x
水平方向伸展组件以填充组件整个宽度部分 (留下 -padx 所确定的外部
填充值外)。
填充值外)。
y
纵向伸展组件以填充组件整个高度部分 (留下 -pady 所确定的外部填充值
外)。
both
水平和垂直方向同时伸展组件。
-in =>; other
将组件插入在 other 窗口包装次序的结尾。
-ipadx =>; amount
留在组件两侧的内部水平填充值。 Amount 必须是有效的屏幕距离,例如2
或者0.5c。默认情形是0。
-ipady =>; amount
留在组件两侧的内部纵向填充值。默认情形是0。
-padx =>; amount
留在组件两侧的外部水平填充值。默认情形是0。
-pady =>; amount
留在组件两侧的外部纵向填充值。默认情形是0。
-side =>; side
指定组件布局在父件的哪一侧。 side 必须是 left、 right、 top 或者
bottom。默认情形是 top。
如果没有指定 -in、 -after 或者 -before 选项,组件将插入在父件包装
序列的结尾处,除非它已受包装器管理。如果指定了以上选项之一,组件插入在
所指定的位置。如果组件已被几何管理器所布局,没有新指定的选项,组件将保
保持先前值,而不接受默认值。
$slave->;packForget
将组件从父件的包装序列中移走,取消组件映射,该组件不再受包装器管理。
$slave->;packInfo
返回一个由 $slave 的当前配置状态所组成的数列,数列的元素与指定给包
装器的配置选项值一致。数列的前面两个元素是``-in =>; master'',master 是
组件的父件。
$master->;packPropaate?(boolean)?
如果布尔值为真, 例如1,则父件可以伸展。如果布尔值为假,则父件不可
以伸展。 以上两种情形都返回一个空串。如果省略布尔值,则该命令返回0或者
1以显示当前情形下父件是否可伸展。 默认情形是可伸展。如果需要窗口大小固
定,应使其不可伸展。
$master->;packSlaves
将父件的一切组件以包装次序返回。如果父件没有组件,返回空串。
exam9.pl 包装器及其选项的使用
#####exam9.pl
use Tk;
$main=new MainWindow;
$button1=$main->;Button(-text=>;'first button',-command=>;sub{prninfo
()})->;pack(-expand=>;'1',-fill=>;'x');
$button2=$main->;Button(-text=>;'second button',-command=>;sub{exit})
->;pack(-ipadx=>;'1c',-padx=>;'1c');
$button3=$main->;Button(-text=>;'third button',-command=>;sub{rmv()})
->;pack(-expand=>;'1',-fill=>;'x');
MainLoop;
sub prninfo{
@a=$button2->;packInfo;
@b=$main->;packSlaves;
print"@a\n";
print"@b\n";
}
sub rmv{
$button3->;packForget;
}
本人是 perl 爱好者,学习 perl 较长时间,赞叹 perl 功能强大、运用广
泛。 遗憾的是 perl 学习资料较少,尤其中文资料更为稀少,而 perl/tk 就没
有见到中文资料,网上某人打出的书籍广告是 800 元/本,本人认为 800 元对
于不少使用者而言, 大大偏高。所以不惜花费时间和精力收集 perl/tk 资料,
对资料进行翻译和加工整理,参考写出本教程,设计出丰富的例程以便使用者学
习理解教程内容。由于收集不到足够丰富的参考资料,教程可能会有不足,欢迎
批评指正。教程目录:
第一章 perl/tk 概要说明
exam1.pl 显示一个窗口
exam2.pl 使用回调
exam3.pl 使用框架
exam4.pl 显示三个窗口
exam5.pl 带滚动杆的列表框
exam6.pl 使用画布
第二章 perl/Tk 组件标准选项
exam7.pl 使用标准选项
第三章 Perl/Tk 特殊变量
exam8.pl Perl/Tk 特殊变量的使用例子
第四章 pack - 包装洞穴边缘的几何管理器
exam9.pl 包装器及其选项的使用
第五章 按钮 - 按钮的创建和使用
exam10.pl 按钮、按钮选项及其方法的使用
第六章 radiobutton - 创建和操作收音机按钮组件
exam11.pl 收音机按钮及选项的应用
第七章 checkbutton - 创建和使用检查按钮组件
exam12.pl 检查按钮及其选项的使用
第八章 listbox - 创建和使用列表框
exam13.pl 列表框、选项和方法的使用
第九章 scrollbar - 创建和使用滚动组件
exam14.pl 滚动杆的创建及其使用
第十章 entry - 创建和使用条目组件
exam15.pl 条目组件的创建及其使用
第十一章 text - 创建和操作文本框组件
exam16.pl 文本框的创建及其方法选项的使用
第十二章 创建和操作画布组件
exam17.pl 画布组件的创建及其使用
第十三章 frame - 创建和使用框架组件
exam18.pl 框架的创建及其使用
第十四章 toplevel - 创建和操作顶层窗口
exam19.pl 顶层窗口的创建和使用
第十五章 scale - 创建和操作刻度组件
exam20.pl 刻度盘的创建和使用
第十六章 menubutton - 创建和操作菜单按钮组件
第十七章 menu - 创建和操作菜单组件
exam21.pl 菜单及其菜单按钮的创建和运用
第十八章 label - 创建和操作标记组件
exam22.pl 使用标记
第十九章 message - 创建和操作信息消息组件
exam23.pl 消息组件的运用
第二十章 destroy - 破坏一个或多个窗口
exam24.pl 破坏方法的运用
第二十一章 bitmap - 位图
exam25.pl 位图显示
第二十二章 photo - 相片
exam26.pl 显示图像
第二十三章 image - 创建和操作图像
第二十四章 颜色
exam27.pl 颜色列表
第二十五章 grid - 将组件布局在格子内的几何管理器
exam28.pl grid 包装器的使用
第二十六章 杂项
一、font - 字体
exam29.pl 字体例子
二、bind - 绑定
exam30.pl 使用绑定
三、exit - 退出程序
exam31.pl 使用退出命令
教程的前四章及例程一到九你已经得到,若需教程的其余部分及例子,请略
付一点费用--40元钱稍微弥补我的上网费用,拜托!收到汇款后我将教程的其
余部分寄到你的电子信箱,请务必在汇款单上注明电子信箱地址。购买教程者,
学习教程内容遇到困难,可来信商讨,本人尽力为你解答
perl/tk 教 程怎么没有下载地址?
您写得很好!!看得出您对Perl/Tk的一些使用和操作掌握得很好。我是perl/Tk的新手,我又一是要向你请教:如何使用Perl/Tk实现“分页式”的菜单按钮呢?我已搞出“下拉式”的按钮,即对话框。但我的老师要求有些地方用“分页式”的按钮更能优化窗口界面,你若知道请告诉我一声吧!十分感谢!!我的联系方式:liuf07156@szcie.pku.edu.cn。十分期待你的回复。。。。