1

tk では、リストボックスは、単一、参照、複数、および拡張のさまざまな selectMode を取ることができます。私が望むのは、一度に 1 つの項目 (シングルまたはブラウズなど) のみを選択し、ユーザーがもう一度クリックしたときにオプションの選択を解除することです。これは、基本的に「シングルまたはなし」オプションです。

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 に答える