tk: заставить список переключаться или отменять выбор

В tk список может принимать несколько различных режимов выбора: одиночный, обзорный, множественный и расширенный. Я хочу, чтобы вы выбирали только один элемент за раз (например, один или просмотр), но затем отменяли выбор параметра, когда пользователь снова щелкает - по сути, вариант «один или ничего».

Я не думаю, что могу использовать обратный вызов ListboxSelect, потому что он вызывается только «когда обновляется набор выбранных элементов в списке», а не когда пользователь щелкает предыдущий выбор.

Должен ли я прибегать к серии флажков?

Примечание. Для списка у меня есть exportselection=0, поэтому я не теряю свой выбор, когда другой виджет получает фокус.


person Jonathan Abbott    schedule 15.07.2013    source источник


Ответы (1)


Вам не нужно прибегать к набору флажков, вы можете просто привязаться к событию нажатия кнопки и добавить обработчик щелчка.

Обратите внимание, например:

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

Теперь, очевидно, есть место для улучшения, но это демонстрирует общую идею.

person This isn't my real name    schedule 31.07.2013
comment
Я буду считать, что ваш ответ правильный. Я работал на Python, и привязки — это определенно то, что нужно. Для удобства пользователя я фактически добавил явную опцию None Selected. Спасибо! - person Jonathan Abbott; 31.07.2013