我有一个Tcl / Tk程序。在其中我有一个组合框,如下:
set cb [ttk::combobox .cb -state readonly -textvariable selection -postcommand [list choices .cb]]
proc choices
在组合框发布时运行,这就是我想要的。我的问题是,如何检测组合框何时发布?
我已尝试在<<ComboboxSelected>>
上绑定并在selection
上设置变量跟踪。每个问题都是它们只在用户实际更改选择时触发。我需要一些方法来始终检测组合框何时发布。
谢谢!
修改
我想要完成的任务:当组合框发布时,它会向用户显示一个选项列表。我不希望用户知道选项的含义,因此我在程序的不同区域中直观地突出显示选项。我突然强调了-postcommand
的触发和运作。问题是知道何时关闭突出显示。
<<ComboboxSelected>>
不会触发。
<Leave>
和<FocusOut>
太快开火(例如,一旦邮箱发布)。
答案 0 :(得分:1)
ttk :: combobox使用的列表框的窗口名称是:
set popdown [ttk::combobox::PopdownWindow .combobox].f.l
我相信这就是你所需要的。
bind <Leave> $popdown mycommand
答案 1 :(得分:1)
组合框的弹出窗口实际上是它自己的窗口嵌套,如果你的组合框被称为.cb
,那么popdown会有一个富有想象力的名字.cb.popdown
(注意这个实施并不保证)。如果您向该窗口小部件的<Unmap>
事件添加绑定,您将看到取消发布; <Unmap>
事件正是当窗口停止在虚拟桌面层意义上显示时发送的通知(而不是仅仅停止显示,比如因为顶部有另一个窗口;也有事件,但它们也是“不是跨平台的。”
棘手的一点:
通常在需要时(即第一次出现时)创建弹出窗口。在绑定窗口之前,您需要窗口存在(但不一定是可见的)。您可以使用ttk::combobox::PopdownWindow
获取弹出窗口小部件的句柄,如果窗口小部件尚不存在,它将生成窗口小部件。 (这是实施的一部分,但它更可能比名称更稳定。)
set popdown [ttk::combobox::PopdownWindow .cb]
bind $popdown <Unmap> {yourCallback %W}
可以在弹出窗口的内部布局中挖掘,但我不推荐它;它很多更有可能在没有警告的情况下改变。
绑定到顶层有一些常见问题,即子窗口也会传递事件。你的回调应该检查它所给出的事件是实际上是的顶层:
proc yourCallback {w} {
if {$w ne [winfo toplevel $w]} { return }
# The rest of your code here...
}