Я бы подошел к этому иначе - вот что я сделал в похожей ситуации:
- Базовый объект данных, представленный в каждой строке, является экземпляром
GObject
- Этот
GObject
подкласс обладает рядом свойств
- Когда свойство изменяется, оно испускает сигнал
notify::myproperty
В то же время:
- My
ListStore
хранит эти объекты и использует метод gtk.TreeViewColumn.set_cell_data_func()
для визуализации каждого столбца (см. Примечание ниже)
- Для каждого объекта / строки мой объект, управляющий
TreeView
, подключается к notify::myproperty
- Функция, связанная с этим сигналом
notify::...
, запускает сигнал row-changed
на ListStore
Код:
def on_myprop_changed(self, iter, prop):
path = self.model.get_path(iter)
self.model.row_changed(path ,iter)
def on_thing_processed(self, thingdata):
# Model is a ListStore
tree_iter = self.model.append((thingdata,))
# You might want to connect to many 'notify::...' signals here,
# or even have your underlying object emit a single signal when
# anything is updated.
hid = thingdata.connect_object('notify::myprop',
self.on_myprop_changed,
tree_iter)
self.hids.add((thingdata, hid))
Я храню скрытые списки в списке, чтобы их можно было отключить после очистки таблицы. Если вы позволите удалить отдельные строки, вам, вероятно, потребуется сохранить их на карте (путь -> скрытый или объект -> скрытый).
Примечание: Вы должны помнить, что set_cell_data_func
заставляет строку перепроверять свою информацию каждый раз, когда происходит перерисовка, поэтому базовая функция должна быть просто функцией поиска, а не интенсивными вычислениями. Практически говоря, из-за этого вы можете избежать процедуры «connect-to-signal / emit-row-change», но лично я чувствую себя лучше, зная, что не будет никаких крайних случаев.