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;
第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' 是部件的名字,一个部件是一个用户接口对象在图形用户接口
我们只是说 这是对象的名字 ,出现在屏幕上 这里有很多其他的部件 如果你想要显示一个按钮,
你使用button 部件 对于text 你使用text 部件
text=>"Hello World" 这个选项对于部件 这个选项 says 这个部件必须给定一个文件 "Hello
World" 选项 根据部件 一个按钮部件 没有必要有所有的label部件选项
请注意 操作符用于这里是 '=>' 相对于之前使用-> 在 $mw ->
一个使用减号 当另外一个使用=号 ,不要混淆这个两个。
你可以保持写其他的选项也可以写在这里 比如,让我们做一个label 用于显示文本
”Hello World"
$mw -> Label(-text=>"Hello World",-font=>"courierfont",-relief=>"raised") ->
pack();
在这个例子, 更多的选项被使用 前面的选项是用于哪个front 必须被使用让文本和
告诉是否应该出现raised,sunken,flat etc 对于一个特定的部件,
阅读手册 Perl让每个部件和每个选项
所有的选项必须单独的通过逗号分隔,这行是有一点难阅读的 随着选项的增加
$mw -> Label(-text=>"Hello World",
-font=>"courierfont",
-relief=>"raised")
-> pack();
下一个是-> pack(); 这个会Pack 部件 '$label' 到windows '$mv' '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部件放在相同的行, 但是在小的程序是方便的。
my $label = $mw -> Label(-text=>"Hello World"); #We created the widget
$label -> pack(-side=>"left", -anchor=>'w'); #We pack it in another line
会创建和显示 一个按钮 部件变量是 '$button' 当我们查看这个选项,
我们会发现2个选项 'text' 和'command'
给定的文本是Quit
因此按钮会有text "Quit" ,命令选项 决定 会发生什么 当用户点击按钮
你可以指定一个函数来执行当用户点击按钮,在这种情况下 程序会退出 当这个按钮被执行
#!/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 是Main Loop 或者事件循环 让job 来借助回调来响应事件。
比如按钮按下 或者定时器到期 如果 这行丢失, 程序会运行和退出不等待用户做任何事情
Widgets 1 : Button, Entry, Label 部件 1:按钮,输入框,标签
一个部件是一个用户接口对象在X图形用户接口, 让我们只是说对象的名字出现在屏幕
这里有很多类型部件,你需要显示在一个按钮,你使用按钮部件
对于文本, 你使用文本部件 用于输入
my $WidgetVariable = $Window > WidgetType(?Option 1=>Value 1, ?Option 2=>Value 2 ??) > pack();
三件事情需要说明关于部件
第一是部件变量 这个我已经在之前解释过了
所有部件的部件变量必须唯一,会用于当部件需要2次访问的时候
每个部件有一些选项 可以 用来配置它
这个通常在部件被定义时候处理,但是它也能在后面处理
最后的事情是每个部件有一些命令, 也用来配置或者做一些事情。
但是在我们开始前,我们需要知道一点关于pack命令我已经之前解释了
但是多做几次你不需要push back 按钮Pack 是一个布局管理器另外一个部件管理器是grid
我们后面会介绍 Pack相比grid是更加简单的
$hello > pack,告诉 解释器来pack部件叫做$hello
按钮:
这会让一个按钮配置执行一些代码, 当button 被按后 这个会指向一个函数
因此当按钮被按后,函数会运行一个按钮显示如下 按钮时创建使用HTML 输入tag
Some Options
text=>"TEXT" TEXT will be the text displayed on the button
command=>CALLBACK CALLBACK will be the code that is called when the button is pushed
#!/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 {
print "xxxxxxxxxx
";
}
点击一个 'Push Me'按钮,就会输出一次。
你可能注意到 我使用了 在命令回调函数 (-command =>&push_button);)
Entry 输入框
一个entry 是一个部件显示一个一行文本串允许用户输入和编辑文本
当一个entry 已经输入,插入的游标表明 新的字符可以被插入到一个空的元素
一些选项:
width=>NUMBER 输入框的宽度 应该是一个整数
textvariable=>$VARIABLE 变量的内容会显示在部件里,如果text 在部件里被编辑,
变量会被自动编辑
state=>STATE 输入域的状态可以是 normal, disabled, or readonly 如果它是只读的,text不能被编辑
一些命令:
语法 描述 例子
$widget > get(); 文本在输入框可以被拿到通过这个命令 $name = $ent > get();
$widget > delete(FIRST?,LAST?);
删除一个或者多个entry的元素 FIRST 是第一个字符index 来删除
LAST 是在最后一个字符index 来删除
#!/usr/local/bin/perl
use Tk;
# Main Window
my $mw = new MainWindow;
#GUI Building Area
my $ent = $mw -> Entry() -> pack();
my $but = $mw -> Button(-text => "Push Me",
-command =>&push_button);
$but -> pack();
MainLoop;
#This is executed when the button is pressed
sub push_button {
$ent -> insert('end',"Hello");
}
在尾部插入 Hello
Label 标签:
这个部件显示文本信息:
一些选项:
text => "TEXT" TEXT will be the text displayed on the button
TEXT 将会是text显示在按钮上
font => FONT
指定字体 来使用 当绘制文本在部件内,你可以指定font 或者事件循环
你可以指定它格式 "FONTNAME SIZE STYLE"
Widgets 2 : Frame, Text, Scrollbar, Scale 窗体,文本,滚动表, 刻度尺
Frame 窗体:
一个框架是一个简单的部件它的主要目的是作为一个间隔装置 或者 容器
对于复杂的windows 布局 frame唯一的功能是它的背景颜色和一个可选的3-D
边界 来让frame 出现 raised or sunken
Frame 可以被创建像任何其他的部件一样:
#!/usr/local/bin/perl
use Tk;
my $mw = new MainWindow; # Main Window
my $frm = $mw -> Frame();
MainLoop;
为了放置其他的部件在窗体里,你应该使用frame 部件变量作为它的parent
通常 parent 是'$mw' 或者 MainWindow
但是我们希望放置一个部件在窗体内, 使用frame 变量 ('$frm' in this case) in
place of '$mw' Like this
my $lab = $frm_name -> Label(-text=>"Name:") -> pack();
Text
一个文本部件显示一行或者多行文本,允许文本被编辑类似于entry部件
$widget > get(index1, ?index2 ?);
返回一个字符串从文本, 返回的值会是所有的字符串在text里 从index=index1开始和index=index2结束
(字符集在index2不会被返回)
如果index2 被省略 那么单个字符在Index1 被返回。
注意text的index 不同于 entry部件
Scrollbar 滚动条
一个滚动条部件是一个部件显示2个箭头, 在滚动条两端,在中间的部分是一个滑动块
它提供的信息是关于 可见的在一个相关的框框 显示一些排序的内容
ipadx => AMOUNT
指定水平内部填充 留下在slaves两边的数量,这个空间是被增加到slave的边境
ipady => AMOUNT 指定垂直的内部填充留给slave两端的
padx => AMOUNT 指定水平外部填充留给slave两边的数量,
在屏幕单元 AMOUNT 可能是两个值的列表来指定填充单独额left或者right
pady => AMOUNT 指定崔志外部填充留给slave顶和底部的数量
row => N 插入slave 让它占据第N行 在grid 行号从0开始
如果这个选项没有指定, slave会被安排在相同的行和先前的slave 被指定在这个请求给grid
column => N
插入到 slave让它占据N列在grid选项 和-row类型
rowspan => N
插入slave 让它占据N行 在grid里 默认是一行
columnspan => N
插入slave 让它占据N列 在grid里
使用grid 需要一些经验,但是你知道HTML 它会帮助你很多
行和列就像HTML的表格,尽管代码不同
Scale 刻度尺:
Dialogs: 对话框
对话框可以被称为元素在一个程序里,分离它本身从main windows
这是一个非常一般的定义和有很多问题但是此刻,它将为Tk提供很多的对话框:
messageBox: 消息框
这个程序创建和显示一个应用指定的消息窗口,一个按钮和一组按钮 每个按钮在消息框是用一个唯一的
象征性符号表示(查看 类型选项)
在消息窗口出现后,messageBox 等待用户来选择一个
一些选项:
default=>name
默认按钮的符号名字对于这个消息框框(ok', 'cancel',and so on)