tk:使列表框“切换”或“取消选择”

时间:2013-07-15 22:05:18

标签: listbox tk

在tk中,列表框可​​以采用多种不同的selectMode:single,browse,multiple和extended。我想要的是一次只选择一个项目(如单个或浏览),但在用户再次点击时取消选择该选项 - 基本上是“单一或无”选项。

我认为我不能使用ListboxSelect回调,因为只有当列表框中的所选项目集更新时才会调用它 - 而不是当用户点击上一个选择时。

我是否必须使用一系列复选框?

注意:对于列表框,我有exportselection = 0,所以当另一个小部件成为焦点时,我不会丢失我的选择。

1 个答案:

答案 0 :(得分:0)

您不必使用一系列复选框,只需绑定到buttonpress事件,然后添加一个点击处理程序。

观察一个例子:

bind $listbox <Button-1> {listbox_selection_toggler %W %x %y}
proc listbox_selection_toggler {W x y} {
    set c [$W cursel]
    set i [$W index @$x,$y]
    lassign [$W bbox $i] x1 y1 x2 y2;
    set x2 [expr {$x1 + $x2}]
    set y2 [expr {$y1 + $y2}]
    if { $y < $y1 || $y > $y2 } {
        puts "(Cur: $c) Clicked on $W at $x,$y, index $i. (NOT IN BBOX)";
    } else {
        puts "(Cur: $c) Clicked on $W at $x,$y, index $i.";
        if { $c != "" && $i == $c } {
            puts "Toggling selection off."
            after 0 [list $W sel clear 0 end]
        }
    }
}

现在,显然还有改进的余地,但这证明了一般的想法。