Tcl 如何将绑定到笔记本选项卡?

Tcl 如何将绑定到笔记本选项卡?,tcl,tk,Tcl,Tk,有一些选项卡,如果选择其中一个,我想做一些事情。请考虑以下代码示例: ttk::notebook .n pack .n frame .n.a frame .n.b pack .n.a -side left pack .n.b -side left .n add .n.a -text A .n add .n.b -text B bind .n <Button-1> {on_click} proc on_click {} { set a [.n select] puts

有一些选项卡,如果选择其中一个,我想做一些事情。请考虑以下代码示例:

ttk::notebook .n
pack .n
frame .n.a
frame .n.b
pack .n.a -side left
pack .n.b -side left
.n add .n.a -text A
.n add .n.b -text B
bind .n <Button-1> {on_click}

proc on_click {} {
    set a [.n select]
    puts $a
    if {$a eq ".n.b"} {
        ....
    }
}

但是,当我第一次单击选项卡B时,仍然会得到输出。或者,如果我更改为单击另一个选项卡,则输出仍然是上一个选项卡。似乎[n选择]延迟?单击选项卡后,如何获取当前选定的实际选项卡?

由于您使用的绑定,确实存在“延迟”。据我所知,当您单击鼠标时,至少会发生两个事件:

按键 按钮释放 当使用“按钮”告知解释器绑定到按钮按下事件时,大多数应用程序实际上会在按钮释放时执行某些操作,例如,如果按下“确定”按钮并按住单击按钮,通常不会发生任何事情,只有在释放单击按钮后才会发生某些事情

记住这一点,如果您将bind更改为bind.n{on_click},那么您将得到您想要的结果


有关参考信息,请参见。

处理绑定的顺序由小部件的bindtags决定。如果您检查笔记本的bindtags,您将看到以下内容:

% bindtags .n
.n TNotebook . all
笔记本类绑定TNotebook负责在单击选项卡时切换选项卡。由于bindtags的顺序,小部件上的绑定在类绑定之前运行。这就是为什么你仍然得到旧的账单

解决这个问题的一种方法是在类绑定之后添加另一个bindtag,并绑定该类上的事件

% bindtags .n {.n TNotebook NBTab . all}
% bind NBTab <Button-1> {on_click}
然而,有一个更简单的方法。notebook小部件提供一个虚拟事件,在选择新选项卡后触发。将on_click proc绑定到该事件有几个优点:当使用键盘更改选项卡时也会调用该proc,如果用户单击已选择的选项卡,则不会运行该proc


注意:如果在将相框添加到笔记本后立即打包,则无需打包。小部件只能由一个几何图形管理器管理。因此,将它们添加到笔记本将撤消pack命令。

非常感谢。这真的让我学到了一些新东西。