我在应用程序中有这些绑定:
bind $::app <Control_L><o> {FileOpen}
bind $::app <Control_L><O> {FileOpen}
FileOpen是一个过程。
我在文本小部件中按Ctrl + o并且FileOpen启动正常,但首先在插入点处将新行插入到文本小部件中。
我知道Ctrl + o是用于在文本小部件中插入换行符的默认绑定,但我的绑定不应该覆盖它吗?
我也尝试了以下内容:
bind $::app <Control_L><o> {}
bind $::app <Control_L><O> {}
bind $::app.text <Control_L><o> {}
bind $::app.text <Control_L><O> {}
bind $::app <Control_L><o> {FileOpen}
bind $::app <Control_L><O> {FileOpen}
仍然没有成功。发生了什么事?
Ubuntu上的Tcl / Tk 8.5.10。
答案 0 :(得分:3)
Tk将绑定分组到称为“绑定标记”(或简称为bindtags)的集合中。每个小部件都以四个绑定标签开头:
all
”绑定标记。(Toplevels只有三个绑定标签。)
bind
的第一个参数实际上不是小部件名称,而是绑定名称。您可以使用bindtags
命令获取和操作窗口小部件的bindtags列表,尽管这是一个非常深远的更改以应用于窗口小部件;您可能希望避免更改绑定标记,除非您正在挖掘深度。 (实际上,您正在更改应用于特定视图的控制器堆栈;要修改的非常微妙的内容。)
当处理发送到窗口小部件的GUI事件时,按顺序考虑该窗口小部件的绑定标签,并且找到附加到该绑定标签的绑定表中的一个条目(或者如果没有匹配则跳过表)并且在应用替换后评估。然后评估下一个绑定标签的绑定表 ,除非绑定脚本评估产生break
异常 。如果绑定评估希望阻止在堆栈上进一步考虑附加到绑定标记的其他脚本,则需要使用break
完成。
这听起来相当复杂,但事实并非如此。在最简单的情况下,将break
放在窗口小部件绑定脚本的末尾,以阻止以后的类,顶层或全局绑定脚本应用。
bind $::app <Control_L><o> {FileOpen}
bind $::app <Control_L><O> {FileOpen}
bind $::app.text <Control_L><o> {SpecificOperation; break}
bind $::app.text <Control_L><O> {SpecificOperation; break}
好的,所以SpecificOperation
可能一点也不。你必须随意调整。
您还可以将执行break
的逻辑放入SpecificOperation
,这在您有时只需执行break
时很有用,但是要使程序发生中断它的调用者你必须这样做:
return -code break