itcl::widget

itcl::widget在形式上与itcl::class基本相同。但其名字本身和设计意图都显然指向Tk Widget。

Tk Widget的组成有三大部分:

  1. 绑定的数据
  2. 提供的方法
  3. 配置的选项

前两者可以分别对应到itcl::class的中的数据(common, variable)和方法(method)。

配置选项这一条则由itcl::option来提供。属于class的部分参见 itcl::class

0x01: option的第1种定义方法

这种方法对应的命令是标准的cgetconfigure的默认实现。没有用户代码的参与。

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"
    }
  }
}