如何将 <Button-1> 绑定到笔记本标签?
How to bind the <Button-1> to the notebook tab?
有一些选项卡,如果选择其中一个,我想做一些事情。请考虑以下代码示例:
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]”延迟?单击选项卡后,如何才能获得真正的当前 selected 选项卡?
确实有一个 'delay',因为您正在使用绑定。当您发出鼠标单击时,会发生 2 个(至少,据我所知)事件:
- 按下按钮
- 释放按钮
虽然使用 'Button' 告诉解释器绑定到按钮按下事件,但大多数应用程序实际上会在按钮释放时执行某些操作(例如,如果您按下 'OK' 按钮并按住,通常什么都不会发生,只有在释放点击后才会发生一些事情。
考虑到这一点,如果您将绑定更改为 bind .n <ButtonRelease-1> {on_click}
,那么您将获得所需的结果。
如需参考,请参阅 manual on bind。
处理绑定的顺序由小部件的绑定标签决定。如果您检查笔记本的绑定标签,您将看到以下内容:
% bindtags .n
.n TNotebook . all
笔记本 class 绑定 (TNotebook) 负责在您单击标签时切换标签。由于 bindtags 的顺序,您对小部件本身的绑定 运行s 在 class 绑定之前。这就是您仍然使用旧标签的原因。
解决这个问题的一种方法是在 class 绑定之后添加另一个 bindtag 并在其上绑定事件。
% bindtags .n {.n TNotebook NBTab . all}
% bind NBTab <Button-1> {on_click}
不过,还有更简单的方法。 ttk::notebook 小部件提供了一个虚拟事件 <>,它会在选择新选项卡后触发。将您的 on_click 过程绑定到该事件有几个优点:当使用键盘更改选项卡时也会调用该过程,如果用户单击已选择的选项卡,它不会 运行。
注意:如果您将框架添加到笔记本中,则无需打包框架。小部件只能由一个几何管理器管理。所以将它们添加到笔记本将撤消打包命令。
有一些选项卡,如果选择其中一个,我想做一些事情。请考虑以下代码示例:
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]”延迟?单击选项卡后,如何才能获得真正的当前 selected 选项卡?
确实有一个 'delay',因为您正在使用绑定。当您发出鼠标单击时,会发生 2 个(至少,据我所知)事件:
- 按下按钮
- 释放按钮
虽然使用 'Button' 告诉解释器绑定到按钮按下事件,但大多数应用程序实际上会在按钮释放时执行某些操作(例如,如果您按下 'OK' 按钮并按住,通常什么都不会发生,只有在释放点击后才会发生一些事情。
考虑到这一点,如果您将绑定更改为 bind .n <ButtonRelease-1> {on_click}
,那么您将获得所需的结果。
如需参考,请参阅 manual on bind。
处理绑定的顺序由小部件的绑定标签决定。如果您检查笔记本的绑定标签,您将看到以下内容:
% bindtags .n
.n TNotebook . all
笔记本 class 绑定 (TNotebook) 负责在您单击标签时切换标签。由于 bindtags 的顺序,您对小部件本身的绑定 运行s 在 class 绑定之前。这就是您仍然使用旧标签的原因。
解决这个问题的一种方法是在 class 绑定之后添加另一个 bindtag 并在其上绑定事件。
% bindtags .n {.n TNotebook NBTab . all}
% bind NBTab <Button-1> {on_click}
不过,还有更简单的方法。 ttk::notebook 小部件提供了一个虚拟事件 <
注意:如果您将框架添加到笔记本中,则无需打包框架。小部件只能由一个几何管理器管理。所以将它们添加到笔记本将撤消打包命令。