2013-07-15 20 views
1

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

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

我必须诉诸一系列复选框吗?

注意:对于列表框,我有exportselection = 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] 
     } 
    } 
} 

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

+0

我会认为你的答案是正确的。我在Python中,绑定肯定是要走的路。为了用户的利益,我实际上添加了一个明确的“无选择”选项。谢谢! –

相关问题