检测ttk :: combobox的unpost

时间:2016-03-19 03:14:08

标签: combobox tcl tk ttk

我有一个Tcl / Tk程序。在其中我有一个组合框,如下:

set cb [ttk::combobox .cb -state readonly -textvariable selection -postcommand [list choices .cb]]

proc choices在组合框发布时运行,这就是我想要的。我的问题是,如何检测组合框何时发布?

我已尝试在<<ComboboxSelected>>上绑定并在selection上设置变量跟踪。每个问题都是它们只在用户实际更改选择时触发。我需要一些方法来始终检测组合框何时发布。

谢谢!

修改

我想要完成的任务:当组合框发布时,它会向用户显示一个选项列表。我不希望用户知道选项的含义,因此我在程序的不同区域中直观地突出显示选项。我突然强调了-postcommand的触发和运作。问题是知道何时关闭突出显示。

如果用户未更改所选值,则

<<ComboboxSelected>>不会触发。

<Leave><FocusOut>太快开火(例如,一旦邮箱发布)。

2 个答案:

答案 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...
    }