我在应用程序中有这些绑定:
bind $::app <Control_L><o> {FileOpen}
bind $::app <Control_L><O> {FileOpen}
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
还是没有成功。到底是怎么回事?
Ubuntu 上的 Tcl/Tk 8.5.10。
Tk 将绑定分组到称为“绑定标签”(或简称为绑定标签)的集合中。每个小部件都以定义在其上的四个绑定标签开始:
all全局绑定的“ ”绑定标签。(顶层只有三个绑定标签。) 的第一个参数bind实际上不是小部件名称,而是绑定标签名称。您可以使用该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}
Run Code Online (Sandbox Code Playgroud)
好吧,所以SpecificOperation可能什么都不是。你必须随心所欲地调整。
您还可以将执行 in 的逻辑break放入SpecificOperation,这在您只需要break有时执行时非常有用,但是要使过程问题中断其调用者,您必须这样做:
return -code break
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
857 次 |
| 最近记录: |