1

在 tk 中,列表框可​​以采用多种不同的选择模式:单一、浏览、多重和扩展。我想要的是一次只选择一个项目(如单个或浏览),然后在用户再次单击时取消选择该选项 - 本质上是“单个或无”选项。

我不认为我可以使用 ListboxSelect 回调,因为它只被称为“当列表框中的选定项目集被更新时”——而不是当用户单击以前的选择时。

我必须求助于一系列复选框吗?

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

4

1 回答 1

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]
        }
    }
}

现在,显然还有改进的空间,但这表明了总体思路。

于 2013-07-31T05:43:25.047 回答