gpt4 book ai didi

tcl - 覆盖 Tcl/Tk 文本小部件中的绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 04:48:25 24 4
gpt4 key购买 nike

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

bind $::app     <Control_L><o>      {FileOpen}
bind $::app <Control_L><O> {FileOpen}

FileOpen 是一个过程。

我在文本小部件中按 Ctrl+o,FileOpen 启动正常,但首先在文本小部件的插入点处插入了一个换行符。

我知道 Ctrl+o 是在文本小部件中插入换行符的默认绑定(bind),但我的绑定(bind)不应该覆盖它吗?

我也试过以下方法:

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。

最佳答案

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

  1. 小部件本身的绑定(bind)标签(与小部件同名),
  2. 小部件类的绑定(bind)标签,
  3. 包含小部件的顶层的绑定(bind)标签,以及
  4. 全局绑定(bind)的“all”绑定(bind)标签。

(顶层只有三个绑定(bind)标签。)bind 的第一个参数实际上不是小部件名称,而是绑定(bind)标签名称。您可以使用 bindtags 命令获取和操作小部件的绑定(bind)标签列表,尽管这是应用于小部件的影响深远的更改;您可能希望避免更改绑定(bind)标签,除非您正在深入研究。 (实际上,您正在更改应用于特定 View 的 Controller 堆栈;需要修改的内容非常微妙。)

当处理发送到小部件的 GUI 事件时,该小部件的绑定(bind)标签将按顺序考虑,并且恰好找到附加到该绑定(bind)标签的绑定(bind)表中的一个条目(如果没有匹配项,则跳过该表)和应用替换后进行评估。然后评估下一个绑定(bind)标签的绑定(bind)表,除非绑定(bind)脚本评估产生break 异常。如果绑定(bind)评估希望阻止考虑附加到堆栈上更远的绑定(bind)标签的其他脚本,则需要以 break 结束。

这一切听起来都相当复杂,但事实并非如此。在最简单的情况下,将 break 放在小部件绑定(bind)脚本的末尾以停止应用后面的类、顶层或全局绑定(bind)脚本。

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

关于tcl - 覆盖 Tcl/Tk 文本小部件中的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19342875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com