2

我在应用程序中有这些绑定:

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。

4

1 回答 1

5

Tk 将绑定分组到称为“绑定标签”(或简称为绑定标签)的集合中。每个小部件都以在其上定义的四个绑定标签开始:

  1. 小部件本身的绑定标签(与小部件同名),
  2. 小部件类的绑定标签,
  3. 包含小部件的顶层的绑定标签,以及
  4. 全局绑定的“<code>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}

好的,所以SpecificOperation可能什么都没有。你必须随心所欲地调整。


您还可以将执行的逻辑break放入 into SpecificOperation,这在您只需要break有时执行时非常有用,但是要使程序发出中断给它的调用者,您必须这样做:

return -code break
于 2013-10-13T07:55:54.037 回答