Events 关于在Tcl/Tk中构造事件的新手问题

Events 关于在Tcl/Tk中构造事件的新手问题,events,tcl,tk,Events,Tcl,Tk,如果试图使用半复杂GUI构建桌面程序,特别是其中用户可以打开相同GUI组件的多个实例,例如拥有“项目”GUI并允许用户在主窗口中同时打开多个项目,将事件监听器推到小部件层次结构的更高位置,并使用事件细节来确定事件发生在哪个小部件上,而不是将事件监听器放在每个小部件上,这是一种良好的做法吗 例如,在web浏览器中执行类似操作时,任何单个项目GUI元素上都没有事件侦听器。侦听器位于包含每个项目GUI的多个实例的父容器上。一个项目在其GUI中有多个选项卡,但一次只有一个选项卡在一个项目中可见,并且在任

如果试图使用半复杂GUI构建桌面程序,特别是其中用户可以打开相同GUI组件的多个实例,例如拥有“项目”GUI并允许用户在主窗口中同时打开多个项目,将事件监听器推到小部件层次结构的更高位置,并使用事件细节来确定事件发生在哪个小部件上,而不是将事件监听器放在每个小部件上,这是一种良好的做法吗

例如,在web浏览器中执行类似操作时,任何单个项目GUI元素上都没有事件侦听器。侦听器位于包含每个项目GUI的多个实例的父容器上。一个项目在其GUI中有多个选项卡,但一次只有一个选项卡在一个项目中可见,并且在任何时候只有一个项目可见;因此,在HTML元素上使用类,然后在
event.target
上使用
e.matches()
方法,以独立于当前可见项目的方式操作当前可见项目中的当前可见选项卡是相当容易的。在没有任何真正的性能测试的情况下,作为一名业余爱好者,我的无保留印象是,尽可能少的事件侦听器会更有效,而我通过阅读不太准确的信息获得了大部分这方面的信息

我最近在John Ousterhout的书中读到,Tk应用程序可以有数百个事件处理程序,我想知道如上所述尝试限制它们的数量是否真的会对Tcl/Tk产生影响

我问这个问题的目的仅仅是为了更好地理解事件,以便正确地开始Tcl/Tk程序的编码,而不必重新编码一堆结构不良的事件侦听器。我不想对书中提到的任何内容提出异议,如果我愿意,我也不知道该怎么做


感谢您提供的任何指导。

拥有数百个事件处理程序通常只是一个标志,表明可能有很多不同的事件被发送。由于您通常(但并非总是)尝试将绑定专门化为尽可能具体的绑定,因此实际的事件处理程序通常非常小,但可能会调用一个过程来完成这项工作。这在实践中往往效果很好。我自己,我的经验法则是,如果这不是一个简单的调用,那么我将加入一个helper过程;这样调试它们更容易。(我的规则的主要例外是如果我想生成一个
中断

通常有四个级别可以绑定到
canvas
text
,另外还有更多特定于小部件的级别:

  • 单个小部件。这是您最常用的小部件
  • 小部件类。这主要由传统知识使用;您通常不想更改它,因为它可能会改变您刚刚使用的代码的行为。(例如,不要改变按钮的行为!)
  • 包含小部件的顶层。这是热键的理想选择。(但要非常小心;此级别的某些绑定可能会有问题。
    通常会咬人。)顶级小部件本身没有这种功能,因为规则1
  • 所有的
    ,它做到了它所说的,而且你几乎从不需要它
  • 您可以使用
    bindtags
    定义其他人,但这通常不是一个很好的计划,因为它需要大量的工作


    要记住的另一件事是Tk支持虚拟事件,
    。它们有各种各样的用途,但在复杂应用程序中(您应该注意)的主要用途是定义偶尔由一系列低级事件触发的高级事件,而不是发起者希望注意的其他小部件。

    谢谢您的解释。在学习JS事件时,我想知道为什么有人会使用自定义事件(看起来与虚拟事件非常相似);但是,现在,通过阅读Tcl/Tk书籍和您的答案,我开始看到它们的好处,特别是允许将来添加的代码在不改变原始代码的情况下工作。我可以问一个后续问题吗?我试图把它作为一个单独的问题,但它被关闭了。在Ousterhout的书(第19页)中,最后一个项目符号附带说明了“Tk提供了一个库,您可以用C创建新的小部件类和几何体管理器,但这种功能很少使用,因此本书中没有介绍。”这本书在哪里介绍?我很想看看我是否能理解并尝试一下。谢谢。据我所知,没有一本书涉及到这一点,因为它实际上并不常用。但是,如果您对此感兴趣,请阅读Tk源代码。这本书写得很好,是我所知道的如何把事情做好的最好指南。