- 1.1 环境搭建
- 1.2 使用 Tk 编写hello world
- 1.3 脚本文件
- 1.4 变量与替换
- 1.4 控制结构
- 1.6 关于 Tcl 语言
- 1.7 事件绑定
- 1.8 Tcl/Tk 更多功能
本篇笔记:
- Tcl/Tk环境搭建
- Tcl的基本介绍
- Tk基本介绍
- Tcl的绑定机制
可以选择使用ActiveState的Tcl发行版:ActivTcl,可免费用于开发目的。
-
安装:在ActiveState官网下载安装包并安装。不想注册账号可以直接网盘下载(version:ActiveTcl-8.6.9.8609.2-MSWin32-x64)。链接:https://pan.baidu.com/s/1YWpI8gS_SElWuBzmgwPezg 提取码:open 如果安装过anaconda的话会安装好tcl环境,使用
tclsh
即可。 -
测试:运行cmd,执行
tclsh85
命令(对应版本,如果是8.6,则输入tclsh86
)出现%开头读取Tcl命令的状态即可。 输入expr 2 + 2
,tclsh输出结果(4)。
- 每一条Tcl命令都会返回一个结果。如果该命令结果无意义,则返回一个空字符串。
- Tcl中所有的值都有字符串表达形式,为了提高效率,减少字符串识别转换,有一部分值会有效率更高的内部表达形式。
ActiveTcl安装路径/bin/ 下有一个wish85应用程序,相比tclsh包含了由Tk定义的命令。 编写hello world:
-
在cmd中执行
wish85
,弹出一个空白窗口与一个控制台窗口: -
在控制台输入下面的Tk脚本:
button .b -text "hello world" -command exit grid .b
- ""内表示字符串。
- button和grid 代表命令,后面的是成对出现的配置选项。grid命令要求几何管理器调用栅格管理器(gridder)来管理.b。
- -option value 代表配置选项和配置值。
- .b 代表主组件的子组件
执行后得到如下结果:
点击按钮后,窗口消失。
1.3 脚本文件把命令写在脚本文件中,文件类型为.tcl。 以上的hello world程序,可以将以下命令保存为hello.tcl,然后用wish85 hello.tcl调用。
# !/usr/local/bin/wish
button .b -text "hello world" -command exit
grid .b
第一行对wish只是一行注释,如果让这个文件成为Unix系统中的可执行文件,那就可以在shell中输入hello.tcl以直接调用这个文件(hello.tcl所在文件夹需要设置环境变量)。
1.4 变量与替换set a 44
expr $a*4
set b [expr $a*4]
第一条命令将值44赋给a。并返回该变量的值。 第二条命令,$让tcl执行变量替换,即 $a
得到44。 第三条命令,使用[]把命令expr $a*4
的结果赋给b。
- Tcl中变量无需声明。
- Tcl具有转义字符\。
创建一个名为factorial的Tcl过程(procedure),实现非负整数的阶乘:
proc factorial {val} {
set result 1
while {$val>0} {
set result [expr $result*$val]
incr val -1
}
return $result
}
- {}相当于"",区别:1. {}可以嵌套 2. {}内所有内容作为参数传递的过程中不发生替换。
- proc命令的参数:过程的名称,{}内的参数名列表,{}内的过程主体。
- return,while含义类似C语言。
- incr是相加指令。
- 过程内用到的变量是局部变量,过程之外的变量称为全局变量。
注意:在Tcl解释器解析参数的时候它根本不知道这是不是脚本。这种机制的一个后果就是左大括号必须在需要获取该输入参数的命令的同一行。如果左大括号换到了新行,那它前面的换行符就标志着命令的结束。 应用这个过程:
注意:不要从语法的角度来理解Tcl。Tcl包含的只是十多条用于解析参数和执行替换的简单原则。
对于Tcl解释器来说,只能根据 命令 参数 这种模式来解释Tcl脚本。Tcl脚本的具体行为是由所执行的命令确定的。命令决定了应该把一个参数是为它所代表的值,还是变量名,或是要执行的代码块等。这样做的好处是,脚本可以为命令定义全新的控制结构,这一功能是大多数语言不具备的。
1.7 事件绑定绑定的含义:特定窗口的特定事件发生 与 执行特定的Tcl脚本 的绑定。即为脚本添加图形化界面。
proc factorial {val} {
set result 1
while {$val>0} {
set result [expr $result*$val]
incr val -1
}
return $result
}
entry .value -width 6 -relief sunken -textvariable value
label .description -text "factorial is"
label .result -textvariable result
button .calculate -text "Calculate" -command {set result [factorial $value]}
bind .value {
.calculate flash
.calculate invoke
}
grid .value .description .result -padx 1m -pady 1m
grid .calculate - - -padx 1m -pady 1m
执行结果:
应用组件有:
- 输入组件 entry .value(名称) -width 6(宽度显示6字符) -relief sunken(内嵌入窗口) -textvariable value(用来保存输入内容的全局变量)
- 标签组件 label
- 按钮组件 button .calculate -text “Calculate” -command {set result [factorial $value]}(按钮执行的命令)
几何管理:
- grid .value .description .result -padx 1m -pady 1m(从左到右排列并周围加1mm间隔,m-毫米,c-厘米)
- grid .calculate - - -padx 1m -pady 1m(- 表示占位)
绑定
- bind .value(组件名) (事件说明) {…}(组件中指定事件发生时调用的内容):三个参数,表示用户通过键盘输入回车。
事件说明符:
事件说明符含义按下1号鼠标键的简写释放1号鼠标键双击1号鼠标键按下a键或a的简写鼠标移动了1号键按下且移动例子: 在wish58执行下面的命令:
bind . {puts "pointer at %x,%y"}
当鼠标移动至空白窗口触发 鼠标移动了 事件,输出箭头的坐标。
- 数组、字典和列表
- 更多的控制结构
- 字符串操作
- 文件访问
- 更多的组件
- 访问其他窗口功能
- 应用程序间通信
- C语言接口
⬇