介绍:
perl/Tk(也被称为pTK) 是一个模块和代码的收集,尝试 简单的配置Tk 8 部件工具包到强大的词素文文字,
动态内存,I/O, 和面向对象,它是一种解释脚本语言 来制作部件和程序 使用GUI
Perl 或者 提取和报告语言是有Larry Wall设计, perl的作者,如下:
Hello World:
让我们开始,作为其他教程的开始, 以"Hello World"程序创建一个文件 叫做Hello.pl
键入下面的内容到它这里:
#!/usr/local/bin/perl
use Tk;
# Main Window
my $mw = new MainWindow;
my $label = $mw -> Label(-text=>"Hello World") -> pack();
my $button = $mw -> Button(-text => "Quit",
-command => sub { exit })
-> pack();
MainLoop;
第一行 #!/usr/local/bin/perl 在Windows里是不需要 在Linux 它告诉脚本语言过程的名字
第2行 use TK, 告诉解释器 我们的程序使用Tk模块 这行是必须的 在所有的GUI 程序里
当解释器遇到这行时,它会加载tk组件 来创建项目。
第三行 这是一行注释 任何行以#开始的是一个注释是不被程序使用的
这是用于程序员来交流的 一个程序员不能被期望记住一个脚本的任何东西
因此使用一个注释来写下 在下次它需要编辑的时候,他可以读注释和了解程序
第四行,my $mw = new MainWindow; 会创建一个windows 窗体 GUI元素会被放置
变量$mv 是MainWindow类型的一个对象 , 我们需要这个元素当我们需要放置任何部件的时候
第五行 $mw -> Label(-text=>"Hello World") -> pack();
标记为标签和写"Hello world" ,你可以改变文本到任何你想要标注的命令结构
$label 这个变量分配到特定的部件 部件必须有一个唯一的变量
这个名字可以用于当部件被访问
$mv-> $mv 是一个MainWindow 的部件 我们需要放置我们的label部件在这个窗体内
Label(-text=>"Hello World") 'Label' 是一个部件的名字,一个部件是一个用户接口对象 在图形用户接口?
只是说 它是对象的名字出现在屏幕里,这里有很多其他部件 如果你需要显示一个按钮,你使用按钮部件
对于文本,你使用文本部件 对于entry ,entry 部件如果你需要,你可以看到更多的部件。
text=>"Hello World" 这个选项的部件是说 这个部件必须给定文本 "Hello World"选项
改变根据部件
一个按钮部件没有label部件的所有的选项
请注意 操作用在这里'=>' 相对于早期使用的'->' 在$mw ->
一个使用 减号 另外一个使用=号 两者不要混淆。
你可以保持写其他的选项 可以可以写在这里比如,让我们做一个label 用于显示文本框’Hello World"
另外行 类似于Hello World 程序
在这个例子,更多的选项被使用 font选项告诉font 必须被使用来让text 和relief 选项告诉
text 是否出现为raised, sunken, flat 等等 对于一个特定的部件,
阅读手册 它列出了每个部件和每个选项, 如果你想要用Perl编程,
所有的选项 必须通过逗号分隔,但是你需要指出,这个行是有点难度的 当大量的选项增加时,
$mw -> Label(-text=>"Hello World",
-font=>"courierfont",
-relief=>"raised")
-> pack();
接下来是 ->pack();
这个会pack 部件 '$label' 到windows '$mw'
’pack' 是一个部件管理器
另外一个布局期是'grid',对于个人来说 grid 相对更好, 把所有这些放在一行 会很难受,你可以放在下一行
my $label = $mw -> Label(-text=>"Hello World")
-> pack();
在这种情况下, pack 没有选项 ,但不总是这样。
my $label = $mw -> Label(-text=>"Hello World")
-> pack(-side=>"left",
-anchor=>'w');
你没有 pack部件在相同行,但是它是方便与小的程序 ,你可以稍后pack部件 使用部件的变量:
my $label = $mw -> Label(-text=>"Hello World"); #We created the widget
$label -> pack(-side=>"left", -anchor=>'w'); #We pack it in another line
因此 我们有最终的语法 如何创建和显示一个部件:
my $WidgetVariable = $Window -> WidgetType(?Option 1=>Value 1, ?Option 2=>Value
2 ??) -> pack()
下面的3行:
my $button = $mw -> Button(-text => "Quit",
-command => sub { exit })
-> pack();
将创建和显示一个按钮 ,部件变量 是'$button' 当我们查看这个选项时候,
我们会找到两个选项 'text' 和 'command' 给出的text 是Quit
因此按钮会有一个text "Quit" 在它上面 命令选项确定 上面应该发生 当用户clik 按钮,
你可以指定一个函数来执行,当用户clicks 一个按钮 在这种情况下
程序会退出 当这个按钮被执行
你可以调用函数,你已经创建的。
#!/usr/local/bin/perl
use Tk;
# Main Window
my $mw = new MainWindow;
my $label = $mw -> Label(-text=>"Hello World") -> pack();
my $button = $mw -> Button(-text => "Quit",
-command =>&exitProgam)
-> pack();
MainLoop;
sub exitProgam {
###弹出一个消息框
$mw->messageBox(-message=>"Goodbye");
exit;
}
下一行-MainLoop;
是主循环或者Event Loop 它的工作是调用callbacks 来响应events
比如 button 按下或者定时器触发, 如果这行丢失,
程序会允许,退出 不等待用户做任何事情, 这是另外一种 Tk程序必须的
Widgets 1 : Button, Entry, Label 按钮,Entry,标签
一个widget 是一个用户接口对象 在X 图形用户接口?
我们只是说 它是对象的名字,出现在屏幕上
这里有很多类型部件 如果你要显示一个按钮, 这里有很多部件类型
如果你要显示一个按钮,你使用按钮部件
比如文本框,你使用文本框部件
输入框, entry 部件
my $WidgetVariable = $Window > WidgetType(?Option 1=>Value 1, ?Option 2=>Value 2 ??) > pack();
三件事情需要说明 关于部件
首先是 部件变量,
第一件事是 部件变量 我在之前已经解释了 所有部件的部件变量
必须是一个唯一的,被使用 当部件需要被2次访问
每个部件有一些选项,可以用来配置
这通常当部件被定义时就被做了,但是也可以后面做
最后的事情是命令 每个部件有一些命令,可以用于配置或者让它做一些事情。
但是在我们开始之前, 我们需要知道一个关于pack命令的东西
pack 是一个布局管理器另外一个布局管理器是'grid'
我们后面会解释 pack 是更加简单的相比grid
Button:
这个会使一个按钮来执行一些代码,当按钮被执行 这个通常指向一个函数
因此当按钮被点击后,这个函数会运行一个按钮 这个按钮时创建使用HTML 输入tag:
一些选项:
text=>"TEXT" TEXT 会被显示在按钮上
command=>CALLBACK CALLBACK 当按钮被点击时被调用
#!/usr/local/bin/perl
use Tk;
# Main Window
my $mw = new MainWindow;
my $but = $mw -> Button(-text => "Push Me",
-command =>&push_button);
$but -> pack();
MainLoop;
#This is executed when the button is pressed
sub push_button {
whatever
}
你可能已经注意到 我是用了一个 slash() 在这个命令回调
Entry: 输入框
一个entry 是一个部件 显示一个一行文本字符串,允许用户输入和编辑文件 当一个entry
已经输入 显示一个插入光标来表明 新的字符会被插入
一个entry 元素 显示如下:
一些选项:
width=>NUMBER 输入域的宽度 应该是一个整数
textvariable=>$VARIABLE 变量 VARIABLE 的内容 会显示在部件,如果text 在部件被编辑,
变量会被自动编辑
state=>STATE 属于域的状态可以是normal,disabled, or readonly
如果 是只读的 text不能被编辑
一些命令:
语法: 描述 Example
$widget > get(); 文本在输入域可以通过这个命令拿到 $name = $ent > get();
$widget > delete(FIRST?,LAST?);
entry FIRST 删除一个或者多个元素
FIRST 是 第一个字符的索引来删除
LAST 是最后字符在最后一个来删除的index
如果last 没有被指定 默认是FIRST +1,
ie 是一个单独的字符 被删除 这个命令返回一个空的字符串
$widget > insert(index,"STRING");
插入的字符串在 通过Index 之前的字符 index是0 对于第一个字符
end 可以用于最后的字符
#!/usr/local/bin/perl
use Tk;
use strict;
# Main Window
my $mw = new MainWindow;
my $button = $mw-<Button(-text=<"Show Quit Dailog", -command =< &exitTheApp)-<pack();
sub exitTheApp {
my $response = $mw -< messageBox(-message=<"Really quit?",-type=<'yesno',-
icon=<'question');
if( $response eq "Yes" ) {
exit
} else {
$mw -< messageBox(-type=<"ok", -message=<"I know you like this application!");
}
}
MainLoop;
chooseColor:
选择颜色出现一个对话框,让用户选择颜色
getOpenFile
过程getOpenFile 和getSaveFile 出现一个对话框 让用户选择一个文件打开或者保存
getOpenFile 命令通常和打开命令在文件菜单里有关系
它的目的是让用户选择一个存在的文件 ,只有用户输入一个非空的文件,
对话框 给用户一个错误提示,需要用户用户给出一个可控选择的 如果应用允许用户创建一个文件
它应该通过提供一个单独的新的menu命令
getSaveFile 命令通常和Save as 命令联系在一起 在文件菜单
如果用户输入一个文件 已经存在的, 对话框提示用户确认 当文件存在 是否应该覆盖
一些选项:
initialdir=>DIRNAME
指定目录应该被显示的 当对话框弹出 如果参数没有被指定,
目录在当前网络 工作目录是被显示 如果参数指定了一个相对路径,返回值转换相对路径为绝对路径
defaultextension=>EXTENSION
指定一个字符串会被附加到文件名 如果用户属于一个文件没有扩展名
默认 值是一个空的字符串,意味着没有扩展 会被追加到文件名。
filetypes=>filePatternList
Toplevel 顶层
toplevel 是一个部件 可以用于创建一个自定义的对话框
一个toplevel 类似于一个窗体 除了toplevel是创建为一个top-level 窗体。
它的X父窗体是屏幕的root windows 相比逻辑父窗体
主要目的是作为一个容器 用于对话框 和其他部件的容易
可以使用toplevel 来创建新的窗体 ,一个部件可以布局在topvele里
Widgets 3 : Radiobutton, Checkbutton
单选按钮:
Radiobutton是一个属于 从多个选项中选择其中一个 如果一个选择和另外一个其他的按钮被点击,
最后的选择会丢失它的状态,被点击的按钮会被选择
Widgets 4 : Listbox 列表框部件:
列表框:
一个列表框 是显示一个字符串的列表,一行一个 ,一个新的列表框没有元素
元素可以被增加或者删除使用部件命令描述如下:
部件: 菜单按钮,菜单,选项按钮
Menubutton 菜单按钮:
一个菜单按钮是一个部件显示一个文本的字符串,bitmap,或者图片和菜单部件相关的
一些其他部件 画布,消息,调节器,滚动条
画布:
canvas 部件是非常重要的部件, 因为所有的点是在图形绘图区域
画图部件实现了结构化的图形 ,一个画布显示 任何条目的数量,
像是长方形 ,圆形,线条,和文本项目
Message 消息:
一个消息框 是一个部件显示一个文本字符 很像 label 部件,但是可以用于制造一个多行文本
合法的选项 指定如何证明文本行必须是left,center或者right 默认是to left
这个选项和anchor 选项一起工作
Adjuster 调节器:
一个调节器 表现为frame 部件 ,一个显著的例外
便捷可以被拖动和扩展
这个部件包含任何数目的窗体, 水平或垂直排列,
Scrolled 滚动条:
Geometry Management : Grid, Pack 部件管理器 Grid 和Pack
grid
grid 命令是用于个grid布局管理器联系在一起, 部署部件按行和列,
被称为 部件master(或者master window)
grid 命令可以有几种构成,依赖选项参数:
一些选项:
sticky => STYLE
这个选项可以用于安置(或者拉伸) 部件 在他的单元格里
包含了0或者多个字符 n,s,e或者w
每个字母 指向一边(north, south,east, or west)
slave会放置 如果n和s 都被指定,slave会延伸来填满整个高度或者宽度
ipadx => AMOUNT
指定水平内部填充的数量 在slave的每一边, 这个空间是被增加在slave的边界
指定垂直内部填充的数量 在slave的每一边,类似于ipadx
padx => AMOUNT 指定水平外部填充的数量 在每个slave的两边,
在屏幕单元 AMOUNT可以是2个值得列表来指定 填充 对于单独的left和right
pady => AMOUNT
指定多少垂直外部填充 来预留top和bottom
Some Common Widget Options 一些公用的部件选项:
大写字母必须被任何粗体的字母替换, 检查手册对于所有的选项
确保你是用的部件支持你使用的选项:
anchor=>POSITION 安置部件相对的位置:n ne nw s se sw e w 或者center
background=>COLOR 背景色
borderwidth=>WIDTH 边界宽度 选择0 会隐藏边界
command=>SCRIPT 当被调用时 执行脚本
cursor=>CURSOR 鼠标光标显示当鼠标点击这个部件
disabledforeground=>COLOR 前段颜色 当部件被禁用时
font=>FONTNAME 前段当部件的状态是nornal
Some Tk Commands 一些Tk命令:
Bind:
bind 命令相关的perl代码 ,如果你要做一些事情当用户双击了一个item 在一个列表框或者
当他按了任何按钮, binds 是你需要让绑定一些在下面的例子: