itcl::widget
itcl::widget
在形式上与itcl::class
基本相同。但其名字本身和设计意图都显然指向Tk Widget。
Tk Widget的组成有三大部分:
- 绑定的数据
- 提供的方法
- 配置的选项
前两者可以分别对应到itcl::class
的中的数据(common, variable)和方法(method)。
配置选项这一条则由itcl::option
来提供。属于class的部分参见 itcl::class
0x01: option的第1种定义方法
这种方法对应的命令是标准的cget
和configure
的默认实现。没有用户代码的参与。
itcl::widget ScrollText {
# 下面的三个option定义等效.
option {-font font Font} {Courier 12}
option -font {Courier 12}
lassign {-font font Font} option resource class
option [list $option $resource $class] {Courier 12}
method scroll {args} {
# 访问 option 的值
set font $itcl_options(-font)
}
}
0x02: option的第2种定义方法
这种方法则允许用户指定自定义的命令来监听option值的读取和设置。
# vim:set syntax=tcl: #
itcl::widget ScrollText {
option -font \
-default {Courier 12} \
-readonly \
-cgetmethod getOption \
-configuremethod setOption \
-validatemethod chkOption
# 与上面的定义等效
set getOptionVar "getOption"
set setOptionVar "setOption"
set chkOptionVar "chkOption"
option -font \
-default {Courier 12} \
-readonly \
-cgetmethodvar getOptionVar \
-configuremethodvar setOptionVar \
-validatemethodvar chkOptionVar
method getOption {option} {
return $itcl_options($option)
}
method setOption {option value} {
set itcl_options($option) $value
}
method chkOption {option value} {
if {![string mach "font*" $value]} {
error "invalid option value for $option = $value"
}
}
}