这里会显示出您选择的修订版和当前版本之间的差别。
— |
tcl:quick-reference [2010/12/31 00:55] (当前版本) |
||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== TCL 快速参考 ====== | ||
+ | |||
+ | ===== Tcl/Tk简介 ===== | ||
+ | |||
+ | |||
+ | Tcl/Tk读音:tickle tee-kay 加州大学伯克利分校 John Ousterhout教授 1988 | ||
+ | |||
+ | Tcl/Tk=Tcl + Tk Tcl=Tool command language Tk=tookit 创建图形用户界面的工具包 | ||
+ | |||
+ | 一般用Tk开发图形界面(如按钮,对话框),用Tcl完成编程功能,如处理用户的输入。 | ||
+ | |||
+ | ===== TCL 特点 ===== | ||
+ | |||
+ | 可扩展性和可整合性(glue together),具有大量的工具包来扩展其功能。跨平台性(script everywhere run everywhere)类似于java。 | ||
+ | |||
+ | ===== TCL 语法 ===== | ||
+ | |||
+ | |||
+ | ==== 1. 格式 ==== | ||
+ | |||
+ | 命令的写法 格式:command arg1 arg2 arg3… | ||
+ | |||
+ | Tcl/Tk命令之间以换行或分号分隔: | ||
+ | <code tcl> | ||
+ | set a 45 | ||
+ | set b 55 | ||
+ | </code> | ||
+ | 或写成: | ||
+ | <code tcl> | ||
+ | set a 45;set b 55 | ||
+ | </code> | ||
+ | |||
+ | 在同一个命令里,字与字之间以空白或Tab分开: | ||
+ | |||
+ | ==== 2. 注释 ==== | ||
+ | |||
+ | 每一行的第一个非空白的字符如果是“#”,则之后的内容会被忽略,视为注释,例如: | ||
+ | |||
+ | <code tcl> | ||
+ | #This is a comment. | ||
+ | Set a 45 | ||
+ | </code> | ||
+ | |||
+ | 但有一种情况需特别注意: | ||
+ | |||
+ | <code tcl> | ||
+ | #This is a comment | ||
+ | set a 45 #This is NOT a comment | ||
+ | </code> | ||
+ | |||
+ | 第二行“#”之后的内容并不会被视为注解,如果要采用这种写法,必须是在命令结束之后,之前提过命令的结束由换新行与结尾分号两种,因此这一行要改成: | ||
+ | |||
+ | <code tcl> | ||
+ | set a 45;#This is a comment | ||
+ | </code> | ||
+ | |||
+ | ==== 3. 替代 ==== | ||
+ | |||
+ | |||
+ | === ⑴变量替代 variable substitution === | ||
+ | |||
+ | |||
+ | 在变量名字的前面加上“$”符号表示在使用这个变量时,将变量名字代换成变量的值,例如: | ||
+ | |||
+ | <code tcl> | ||
+ | set pi 3.14159 | ||
+ | expr $pi*25*25 | ||
+ | </code> | ||
+ | |||
+ | 第一行在给定一个叫做pi变量的初值,第二行要使用这个变量,为了能将变量名称替换成变量的值,所以在变量前加上“$”符号。给定变量初值是不必加上“$”符号,使用变量时才加上“$”符号,表示代换成变量的值。 | ||
+ | |||
+ | Varisble substitution还有另外一个形式,例如 | ||
+ | set length 50cm | ||
+ | |||
+ | 如果想以变量取代50的部分,下面这段写法是错误的: | ||
+ | |||
+ | set len 50;set length $lencm | ||
+ | |||
+ | 因为Tcl会把$lencm当成一个变量,所以应该改成; | ||
+ | |||
+ | set len 50;set length ${len}cm 变量的部分以{}围住 | ||
+ | |||
+ | === ⑵命令替代 command substitution === | ||
+ | |||
+ | |||
+ | set grams [expr $kg*1000] | ||
+ | |||
+ | 上面的命令将grams指定成“expr $kg*1000”的命令,因为替换的是合法完整的Tcl命令,所以叫做 command substitution,命令必须合法的Tcl命令,并且以一对中括号“[]”围住。Command substitution的内容则是命令的结果,例如上面的例子,grams的内容为“expr $kg*1000”的结果,其中$kg则是之前介绍的 variable substitution,expr是tcl的命令,像是电脑的命令,用来计算后面的算式,因此经 command substitution后的结果,grams的值为50000. | ||
+ | |||
+ | === ⑶反斜线替代 backslash substitution === | ||
+ | |||
+ | |||
+ | 反斜线替代用在指定一个字符串,Tcl里有一些符号都具有特殊功能,例如之前提过的“$”符号,在给定字符串初值时,为了避免Tcl将“$”符号误认为变量替代,所以在这些特殊号前加上反斜线“\”,即反斜线替代。 | ||
+ | |||
+ | 在c语言中有这种用法的典型例子,例如: | ||
+ | |||
+ | printf(“this is a pig.\nThat is a dog.\n”);其中,“\n”表示换行,这种做法就是反斜线替代。举个Tcl的例子: | ||
+ | |||
+ | set msg Freshmeat:\ \$3.14/kg\nSlashdot:\ \$1.73/kg | ||
+ | |||
+ | msg的内容为: | ||
+ | |||
+ | Freshmeat:$3.14/kg | ||
+ | Slashdot:$1.73/kg | ||
+ | |||
+ | 其中使用反斜线替代的有:”\ ”è”空格 “\n”è换行 “\$”è$ | ||
+ | |||
+ | 单一的反斜线还有一个用途,就是连接下一行,例如: | ||
+ | |||
+ | <code tcl> | ||
+ | button .bt –width 120 –height 75\ | ||
+ | -text “Save changes” | ||
+ | </code> | ||
+ | |||
+ | 当一行的命令太长而需要断行时,可利用反斜线来连接下一行。要注意的事,连接下一行时,不管下一行前面有多少空白,都会只空一个空白。 | ||
+ | |||
+ | ==== 4. 组合 双引号和花括号 ==== | ||
+ | |||
+ | |||
+ | 双引号允许你指定包含空格的单词。我们看下面的这个例子: | ||
+ | |||
+ | <code tcl> | ||
+ | set x 24 | ||
+ | set y 18 | ||
+ | set z “$x + $y is [expr $x + $y]” | ||
+ | </code> | ||
+ | |||
+ | 在这三个命令都被解释后,变量z的值将是24+18 is 42。双引号之间的所有语句作为一个参数传给set命令。 | ||
+ | |||
+ | 此处需要注意几点: | ||
+ | - 引号之间的命令和变量替代仍起作用, | ||
+ | - 引号自身不会被传给命令。 | ||
+ | |||
+ | 如果没有引号的话,set命令会得到6个参数,这将引起错误。 | ||
+ | |||
+ | 花括号与双引号的不同之处在于: | ||
+ | * 花括号内的替代不起作用: | ||
+ | |||
+ | <code> | ||
+ | set z {$x + $y is [expr $x +$y]} | ||
+ | </code> | ||
+ | |||
+ | 这个命令把变量z赋值为 "$x + $y is [expr $x +$y]"。 | ||
+ | |||
+ | ==== 5. Tk 构件 ==== | ||
+ | |||
+ | |||
+ | Tk提供产生widget的命令,每个命令都有许多参数,下命令时如果未加以指定参数,均使用默认值。所有产生widget的命令语法都是 | ||
+ | Command <name> <options> | ||
+ | === ⑴button === | ||
+ | |||
+ | Tk的button命令可用来产生一个butto widget。如: | ||
+ | #!/usr/bin/wish | ||
+ | button .bt –text “Hello World.” | ||
+ | Pack .bt | ||
+ | Pack命令为button计算大小与设置相关属性,然后再“贴”到视窗上。如果只产生widget,却没有pack的话,将只能看到一个空白的窗口。 | ||
+ | === ⑵frame === | ||
+ | |||
+ | frame是一个重要的widget,frame widget最主要的用途是用来放置其他的widget。这么做的原因,也是为了能让窗口设置更美观方便。这就类似于画画之前,我们会在画布上描绘出大体的位置,然后再在其中作画。 | ||
+ | <code tcl> | ||
+ | #!/usr/bin/wish –f | ||
+ | frame .fr –borderwidth 2 | ||
+ | button .fr.bt1 –text “Hello Kitty!” | ||
+ | button .fr.bt2 –text “Hello Jacky!” | ||
+ | pack .fr.bt1 –side right | ||
+ | pack .fr.bt2 –side left | ||
+ | pack .fr | ||
+ | </code> | ||
+ | 利用pack命令与参数让把这两个button widgets分别配置在frame的左右边。 | ||
+ | |||
+ | 注意:如果没有指定frame的大小,默认是以最小来显示。如果frame里含有其他的构建,pack是会自动改变frame的大小。 | ||
+ | |||
+ | 另一个例子: | ||
+ | <code tcl> | ||
+ | #!/usr/bin/wish –f | ||
+ | frame .fr –borderwidth 2 | ||
+ | button .fr.bt1 –text “Hello Kitty!” –command{wm title .”hello kitty!”} | ||
+ | button .fr.bt2 –text “Hello Jacky!” –command{wm title . “hello jacky!”} | ||
+ | pack .fr.bt1 –side right | ||
+ | pack .fr.bt2 –side left | ||
+ | pack .fr | ||
+ | </code> | ||
+ | -command是button命令的参数,表示当这个widget被click后所要执行的命令,wm title用来改变window标题行文字。 | ||
+ | |||
+ | 需要注意的是:并不是所有的构件都提供command参数。 | ||
+ | |||
+ | === ⑶listbox === | ||
+ | |||
+ | listbox命令用来建立列表构件,把项目加入列表可以利用列表的insert命令: | ||
+ | <code tcl> | ||
+ | listbox .people | ||
+ | .people insert 0 jollen | ||
+ | .people insert 1 jacky | ||
+ | </code> | ||
+ | 0是index值,表示插入数据在第0个元素之后。利用构件的命令也可以是说在编辑构件,将构件编辑好后,在利用pack命令就可以把编辑好的widget显示到屏幕上。 | ||
+ | |||
+ | ==== 6. 变量 ==== | ||
+ | |||
+ | === ⑴指定变量的值 === | ||
+ | |||
+ | |||
+ | 利用关键字set来给定变量的值,任何类型的值可以赋给任何的变量。 | ||
+ | |||
+ | set <varName> <value> | ||
+ | |||
+ | 若没有指定value,表示返回变量的值,但前提是变量必须已指定初值,即已set过 | ||
+ | |||
+ | set msg 123 | ||
+ | set; #传回msg的值,即123 | ||
+ | |||
+ | === ⑵全局变量 === | ||
+ | |||
+ | |||
+ | Tcl/Tk声明全局变量的方法是利用关键字global:global max | ||
+ | |||
+ | 连续声明变量之间是加空格而不是逗号: global max min | ||
+ | |||
+ | === ⑶unset、incr、append === | ||
+ | |||
+ | |||
+ | unset | ||
+ | unset <varname> <varname>… | ||
+ | |||
+ | 用于删除变量,删除后的变量即不存在,要再使用的话必须重新set,unset过的变量也必须是set过的变量。 | ||
+ | |||
+ | incr | ||
+ | incr <varname> <increment> | ||
+ | |||
+ | 用于将varname加上increment的值,varname必须是整数,十进位,八进位或十六进位的数。如果未指定increment的值,默认值为1。 | ||
+ | |||
+ | append | ||
+ | append <varname> <value> <value>… | ||
+ | |||
+ | 将value依序加到varname之后,varname也可以是一个新变量(即为set过)如: | ||
+ | |||
+ | #!/usr/bin/wish | ||
+ | set i 0 | ||
+ | append i 1 2 3 4 5 6 7 8 9 | ||
+ | puts $i | ||
+ | |||
+ | 输出: | ||
+ | 0 1 2 3 4 5 6 7 8 9 | ||
+ | |||
+ | === ⑷数组 === | ||
+ | |||
+ | |||
+ | Tcl使用数组的语法如下: varName(elementName) | ||
+ | |||
+ | 例如: | ||
+ | |||
+ | set Age(Paul) 20 | ||
+ | set Age(john) 25 | ||
+ | |||
+ | Age是数组名字,Paul与John则是元素名称,用来索引数组元素。由于数组与元素计数不必事先声明,所以当元素名字不存在时,即表示增加数组的元素。 | ||
+ | |||
+ | === ⑸多维数组 === | ||
+ | |||
+ | |||
+ | 使用多维数组只要在元素之间加上逗号即可: | ||
+ | |||
+ | <code tcl> | ||
+ | set matrix(1,1) 5 | ||
+ | set matrix(1,2) 10 | ||
+ | set matrix(2,1) 15 | ||
+ | set matrix(2,2) 20 | ||
+ | set sum [expr $matrix(1,1)+$matrix(1,2)+$matrix(2,1)+$matrix(2,2)] | ||
+ | |||
+ | ==>50 | ||
+ | </code> | ||
+ | |||
+ | ==== 7. 运算符 ==== | ||
+ | |||
+ | === ⑴进位表示 === | ||
+ | |||
+ | |||
+ | Tcl以0x开头代表十六进位,0(zero)开头表示八进位,例如:0x1F 0278 | ||
+ | |||
+ | === ⑵数学运算符 === | ||
+ | |||
+ | |||
+ | +加法运算符 –减法运算符 *乘法运算符 /除法运算符 %余数运算符(两个运算符都必须是整数) | ||
+ | |||
+ | === ⑶关系运算符 === | ||
+ | |||
+ | |||
+ | * < 小于 | ||
+ | * <=小于等于 | ||
+ | * >=大于等于 | ||
+ | * >大于 | ||
+ | * ==等于 | ||
+ | * !=不等于 | ||
+ | |||
+ | |||
+ | |||
+ | 比较的结果返回1或0(true or false) | ||
+ | |||
+ | === ⑷逻辑运算符 === | ||
+ | |||
+ | |||
+ | && and | ||
+ | |||