在tk中,列表框可以采用多种不同的selectMode:single,browse,multiple和extended。我想要的是一次只选择一个项目(如单个或浏览),但在用户再次点击时取消选择该选项 - 基本上是“单一或无”选项。
我认为我不能使用ListboxSelect回调,因为只有当列表框中的所选项目集更新时才会调用它 - 而不是当用户点击上一个选择时。
我是否必须使用一系列复选框?
注意:对于列表框,我有exportselection = 0,所以当另一个小部件成为焦点时,我不会丢失我的选择。
答案 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]
}
}
}
现在,显然还有改进的余地,但这证明了一般的想法。