回答他人的一个问题:有很多设置了-textvar
的按钮,被点击时要记录被点击按钮的文字内容。
button .btn_123 -textvar btn_textvar_123 bindtags .btn_123 [concat [bindtags .btn_123] LogButton] # ... add more buttons ... # bind LogButton <Button-1> { puts "\$[%W cget -textvar] = [%W cget -text]" }
主要是对Tk中事件绑定的处理:
bindtags
命令对按钮进行标记和分类bind
命令绑定事件(event)-command
选项不支持替换Tk中的组件默认有4个tag:
path
,比如 ".btn_123"class
,比如 "Button"tag的顺序对应事件处理的优先级。
button的path可以从鼠标位置获得
set widget [winfo containing [winfo pointerx .] [winfo pointery .]]
上面提到Button的"-command"选项不支持'%'替换,如果仍然希望知道当前Button的path的话,下面的方法可以一试:
button .btn_123 -command { set w [lindex [info frame -1] 5 0] ;# $w 就是要找的 path puts [$w cget text] }
关键点是info frame -1
命令的使用。其返回值示例如下:
type eval line 1 cmd {.b invoke}
vtcl是一个用于Tcl/Tk的GUI Builder。由它生成的Tk组件进行了一定的封装。
其生成的Tk Button的"-command"内容如下
button $site_7_0.cpd82 \ -command [list vTcl:DoCmdOption $site_7_0.cpd82 {puts "... %widget %top ..."}] vTcl:DefineAlias "$site_7_0.cpd82" "fg_button_2" vTcl:WidgetProc "User_Cmd" 1
其中的%widget
和%top
会被替换。
vTcl:DefineAlias
部分则通过interp alias
绑定了别名。