如何将<button-1>绑定到笔记本选项卡?

时间:2018-01-26 04:49:17

标签: 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 $a
    if {$a eq ".n.b"} {
        ....
    }
}

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

2 个答案:

答案 0 :(得分:1)

由于您正在使用的绑定,确实存在“延迟”。发出鼠标点击时发生了2次(至少据我所知)事件:

  1. 按钮按
  2. 按钮发布
  3. 虽然使用'Button'告诉解释器绑定按钮按下事件,大多数应用程序实际上在按钮释放时执行某些操作(例如,如果您按下“确定”按钮并按住单击按钮,通常不会发生任何事情,以及某些事情只有在发布点击后才会发生。

    考虑到这一点,如果您将绑定更改为bind .n <ButtonRelease-1> {on_click},那么您将获得所需的结果。

    供参考,请参阅manual on bind

答案 1 :(得分:0)

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

% bindtags .n
.n TNotebook . all

笔记本类绑定(TNotebook)在您单击它们时负责切换标签。由于绑定标记的顺序,您对窗口小部件的绑定在类绑定之前运行。这就是你仍然得到旧标签的原因。

解决此问题的一种方法是在类绑定之后添加另一个绑定标签并在其上绑定事件。

% bindtags .n {.n TNotebook NBTab . all}
% bind NBTab <Button-1> {on_click}

然而,这是一种更简单的方法。 ttk :: notebook小部件提供虚拟事件&lt;&lt; NotebookTabChanged&gt;&gt;,在选择新选项卡后触发。将on_click proc绑定到该事件有一些优点:当使用键盘更改选项卡时也会调用proc,如果用户单击已选择的选项卡,则不会运行proc。

注意:如果将帧添加到笔记本中,则无需立即打包。窗口小部件只能由一个几何管理器管理。因此,将它们添加到笔记本中将撤消包命令。