Tcl/Tk入门(中)

编写Tcl脚本之前,必须学会两件事:

1).必须学会Tcl语法,其内容是决定如何解析命令规则;

2).必须掌握在脚本中使用的独立命令(Tcl提供了近百条内建命令,Tk提供几十条)。


第一部分 Tcl语言基础

1.1.脚本、命令和单词的基本概念

        Tcl脚本包含一条或多条命令。命令通过换行符或分号隔开。每条命令都包含一个或多个单词,第一个单词是命令名,其他单词

是命令的参数。而Tcl处理一个命令分为两步:解析和执行。在解析时,Tcl解释器将命令分解为单词,并执行替换。Tcl解释器只是

进行简单的字符串操作。例如:将字符串$input用input变量中存放的字符串代替。在执行阶段,命令中的各个单词都有了具体的

意义。Tcl把第一个单词作为命令名称,检查这个命令是否已经定义,并且查找完成该命令功能的命令过程。若命令已经定义,Tcl

解释器就调用该命令过程,把命令中的全部单词传递给该过程。命令过程会根据自己的需要来分辨这些单词的意义。也就是说Tcl

的命令由两部分组成,第一部分是命令名,第二部分是命令名后面的若干单词,做为命令的参数。


1.2.脚本执行的过程

1.2.1.命令替换

        命令解析时的变量替换(把单词中的原始字符替换为另外的值)。Tcl提供了三种替换形式:变量替换、命令替换、反斜线

替换。Tcl替换的逻辑:

1).Tcl解析一条命令时,只从左向右解析一次,进行一轮替换。每个字符只会被扫描一次。

2).每一个字符只会发生一次替换,而不会对替换后的结果再进行一次扫描替换。


Tcl替换的分类

1).变量替换:由$符号引发,将Tcl变量的值插入单词中。

2).命令替换:可把一个单词的部分或全部替换为一个命令的结果。命令替换通过方括号表示,会调用括号中的命令。

3).反斜线替换:用于向单词中插入像换行符这样的特殊字符,以及像[、$这样的会被Tcl解析器认为是有特殊含义的字符


        有替换就有不替换的情况。Tcl提供了一些方法,可以阻止解析器对$和分号等字符进行特殊处理,这些方法称为引用。

Tcl的引用包括以下两种(反斜线替换也是一种引用):

1).双引号引用:取消其中的单词和命令分隔符的特殊解释。

2).大括号引用:取消其中所有特殊字符的特殊解释。


总结:完成了命令的替换,也就完成了命令的解析。


1.2.2.命令执行





1.3.变量和表达式

1.3.1.变量

Tcl支持两种类型的变量:简单变量(数量变量)和关联数组。

1).简单变量:包含一个名字和一个值。名字和值都可以是任意字符串。

      变量名命名规则:以一个字母开头,由一些字母、数字和下划线组成。区分大小写。

      Tcl的内部数据存储。==》高效的内部表达形式。

2).数组:数组是元素的集合,每一个元素是有自己的名称和值的变量。

    数组元素的名称由两部分组成:数组名和数组中的元素名。数组名和元素名可以是任意字符串。

    数组的语法形式: 数组名(元素名)

    数组是无序的数据结构(在Tcl内部使用一个哈希表存储数组元素)

    Tcl列表是有序的数据结构。   


1.3.2.表达式



1.4.字符串操作


1.5.列表


1.6.字典


1.7.流程控制


1. if...elseif...else 结构:

    if expr1? then? body1 elseif expr2? then? body2 elseif...? else?bodyN? 

if {$x != 1} {
      puts "$x is !=1"
  } else {
      puts "$x is 1"   
  }


if {条件1} then{
     puts "语句1"
  }  elseif {条件2} then{   
     puts "语句2"  
  }  else { puts "不满足条件1、条件2" }


2. switch 结构:

    switch string pattern1 body1 ?pattern2 body2? ... ?patternN bodyN?
    switch string { pattern1 body1 ?pattern2 body2?...?patternN bodyN? }


switch $x "ONE" "puts ONE=1" "TWO" "puts TWO=2" "default" "puts NO_MATCH"
结果:NO_MATCH


set a "one"
set b one
switch $a {
       "$b" {puts "MATCH.."}
       one  {puts "MATCH,YEAH! "}
       default {puts " NO MATCH"}
  } 
结果:MATCH,YEAH!


3.while循环结构:
   
while test body  [test:条件;body:循环体]


set x 1
while {$x < 5} {
   puts "x is $x"
   set x [expr {$x + 1}]
}
puts "exited loop with x equal to $x\n"

输出结果:
x is 1
x is 2
x is 3
x is 4
exited loop with x equal to 5


下面的例子,可以说明在 循环体内 { }  和 “ ” 的区别: 


set x 0
while "$x < 5" {
    set x [expr {$x + 1}]
    if {$x > 7} break
    if "$x > 3" continue
    puts "x is $x"
}

puts "exited this loop with X equal to $x"

输出结果:
inter loop before x=1
x is 1
inter loop before x=2
x is 2
inter loop before x=3
x is 3
inter loop before x=4
inter loop before x=5
inter loop before x=6
inter loop before x=7
exited this loop with X equal to 8


4.for循环结构:

     for start test next body [start:进入循环前必须执行的语句,test:进入循环的判断,next:循环计数自增加(也可以是其他语句),body:循环体 ]


for {set i 0} {$i < 10} {incr i} {
    puts "I inside first loop:$i"
}

for {set i 3} {$i < 2} {incr i} {
    puts "I inside second loop: $i"
}

结果:
I inside first loop:0
I inside first loop:1
I inside first loop:2
I inside first loop:3
I inside first loop:4
I inside first loop:5
I inside first loop:6
I inside first loop:7
I inside first loop:8
I inside first loop:9


5.自定义命令:

proc name args body


proc sum {arg1 arg2} {
    set x [expr {$arg1 + $arg2}];
    return $x
}

puts " The sum of 2 + 3 is: [sum 2 3]\n\n"

proc for {a b c} {
    puts "The for command has been replaced by a puts";
    puts "The arguments were: $a\n$b\n$c\n"
}

for {set i 1} {$i < 10} {incr i}

输出结果:
The sum of 2 + 3 is: 5

The for command has been replaced by a puts
The arguments were: set i 1

$i < 10
incr i


1.8.过程


1.9.命名空间


1.10.访问文件


1.11.进程间通信


1.12.错误与异常


1.13.其他

1.13.1.创建与使用Tcl脚本库

1.13.2.Tcl内部管理

1.13.3.其他


实例:

1.13.3.1.字符串输出:puts

puts "hello,world"
puts {hello,world}


1.13.3.2.变量赋值:set

注:Tcl是面向字符串的语言。因此,Tcl中的所有变量都可以认为是字符串变量。这个在下面的例子中还会有涉及。

set  b  5
set  fruit  apple

1.13.3.3.变量使用:$

注:expr 是求解表达式的值,[ ] 将expr 的结果做为一个变量给puts输出。

set a 5
set b 6
puts  [expr {$a + $b}]

1.13.3.4.Tcl中的运算符:

  -  减号;  +  加号;    ~  逐位非;! 非;
  ** 幂;     *  乘号;     /  除号;      %   取余;
  << >>  左、右移位(必须是整数);   <  小于;  >  大于;  <=  小于等于;   >=  大于等于;
  eq  比较两个字符串是否相等;      ne  比较两个字符串不等;
  in  check一个字符串是否包含在list中;       ni  check一个字符串是否不包含在list中; 
  &  与;      ^  异或;        |  或;       &&  逻辑与;          ||  逻辑或;
  x?y:z    if-then-else(与java中的该运算形式是一致的)

set a 128 
expr {$a >> 1}   结果:64        
expr {$a << 2}   结果:512

set p 1
expr {$p>0? ($p+1) : ($p-1)}   结果:2

1.13.3.5.Tcl支持的数学函数表达式:

  abs         acos         asin        atan
  atan2     bool          ceil         cos
  cosh       double     entier      exp
  floor        fmod        hypot       int
  isqrt        log           log10       max
  min         pow          rand        round
  sin          sinh          sqrt          srand
  tan          tanh          wide



1.13.3.6.Tcl的类型转换函数:

double( )      将一个数字 转换为一个浮点数
int( )              将一个数字 转换为整数,截取掉小数部分
wide( )          将数字转换为宽整数
entier( )         实在不明白这个是干啥用的。(-_-~)

注:作为初学者,实在是不明白 wide( ) 、entier( ) 函数是在什么情况下使用。

puts [expr {double(1)}]   结果:1.0
puts [expr {int(2.2)}]    结果:2
puts [expr {wide(3.4)}]   结果:3
puts [expr {entier(10.00)}]  结果:10



1.13.3.7.字符串操作:string length

注:参看以下例子,Tcl是将数字、字符串都看做字符串来处理的。不知道是否应该这样理解,若理解的不正确,盼指教!

set b "abcdef"
set x 2
expr {[string length $b]-2*$x}       结果:2

set b 12.45  
set x 2
expr {[string length $b]-2*$x}       结果:1   
数字 12.45 被string length 当做字符串处理,得到结果5。当然 string length 可能本来就要将所有变量当做字符串来处理吧。




第二部分  Tk脚本编写

2.1.Tk概述


2.2.Tk的组件

2.3.主题组件

2.4.字体、位图和图像

2.5.几何管理器

2.6.事件和绑定

2.7.画布组件

2.8.文本组件

2.9.选择与剪贴板

2.10.窗口管理器

2.11.其他

2.11.1.焦点、模态交互与自定义对话框

2.11.2.其他



第三部分  Tcl应用程序的编写

3.1.Tcl与C语言的集成原理


3.2.解释器


3.3.Tcl对象


3.4.处理Tcl代码


3.5.访问Tcl变量


3.6.创建新的Tcl命令


3.7.扩展包


3.8.嵌入Tcl


3.9.异常


3.10.字符串工具


3.11.哈希表


3.12.列表和字典对象


3.13.通道


3.14.事件处理


3.15.文件系统的交互


3.16.操作系统工具


3.17.线程


3.18.构建Tcl及其扩展










修订:

1.修订于2014年11月22日,修改了文章结构,内容组织。纠正了错误的理解。



参考:

        《TCL/TK入门经典(第二版)》





注:

        根据 官网的Tutorial教程写的,例子用来熟悉语法。Tcl/Tk入门(下)会做一个东西出来,以检验学习效果。




  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光明矢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值