Это потенциально ошибка, хотя, возможно, я что-то неправильно понимаю.
Краткое описание
По сути, я обнаружил, что используя "Shift + Arrows" длясделать множественный выбор в Gtk.TreeView
не работает правильно после изменения выбора с помощью Gtk.TreeSelection.select_iter
. С другой стороны, если вы измените выделение, щелкнув строку и нажав «Shift + Arrows», выделение будет работать так, как и следовало ожидать.
Я должен отметить, что если вы измените выделенную строку, вызвавGtk.TreeSelection.select_iter
, пользовательский интерфейс обновляется, как вы ожидаете, и вызов Gtk.TreeSelection.get_selected_rows()
возвращает строки, которые он должен. Только тогда, когда вы пытаетесь выбрать несколько строк с помощью клавиш со стрелками, вы получаете странное поведение.
Возможно, это лучше всего проиллюстрировано в этом автономном примере, который я постарался сделать максимально простым:
Код
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class TreeViewBug(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.connect('destroy', Gtk.main_quit)
# Create model consisting of row path and a name
self.treeModel = Gtk.ListStore(int, str)
self.treeModel.append([0, 'alice'])
self.treeModel.append([1, 'bob'])
self.treeModel.append([2, 'chad'])
self.treeModel.append([3, 'dan'])
self.treeModel.append([4, 'emma'])
self.treeView = Gtk.TreeView()
self.treeView.append_column(Gtk.TreeViewColumn('path', Gtk.CellRendererText(), text=0))
self.treeView.append_column(Gtk.TreeViewColumn('name', Gtk.CellRendererText(), text=1))
self.treeView.set_model(self.treeModel)
# Allow for multiple selection
self.treeView.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
self.add(self.treeView)
def run(self):
self.show_all()
# Focus the TreeView so we can test multiple select via keyboard without clicking on a row
self.treeView.grab_focus()
# Manually change the selected row to the row with "chad"
chadIter = self.treeModel[2].iter
self.treeView.get_selection().select_iter(chadIter)
print('Press "Shift+Down" and see what happens')
print(' it should select "chad, dan", but instead it selects "bob, chad"')
print('Afterwards, try clicking on "chad" and then pressing Shift+Down. It should behave normally')
Gtk.main()
if __name__ == '__main__':
tv = TreeViewBug()
tv.run()
Вещи, которые я пробовал
Сначала я столкнулся с ошибкой, когда мой код изменил выбранную строкучерез Gtk.TreeSelection.select_iter
в ответ на нажатие кнопки.
Я также пытался:
- добавить пользовательскую функцию выбора (
Gtk.TreeSelection.set_select_function
) - очистить выбор перед его изменением (
Gtk.TreeSelection.unselect_all
) - изменение выбора асинхронно (
GLib.idle_add
). - перерисовка
TreeView
после изменения выбора
Спекуляции
IЯ предполагаю, что TreeView
/ TreeViewSelection
имеет некоторый внутренний выбор отслеживания переменных состояния и строку, которая по некоторым причинам не обновляется должным образом при вызове TreeSelection.select_iter
. Эти переменные, вероятно, связаны с функциями пользовательского интерфейса, поскольку TreeSelection.get_selected_rows
по-прежнему работает правильно. Также имеет смысл, что пользовательскому интерфейсу потребуется дополнительная информация о состоянии, поскольку логика множественного выбора в пользовательском интерфейсе зависит от предыдущего взаимодействия с пользовательским интерфейсом (Shift + Down ведет себя по-разному при расширении выбора в зависимости от того, изначально вы выбрали восходящий или нисходящий режим)