У меня есть своя собственная структура данных древовидной структуры в памяти, и я хочу использовать gtk GenericTreeModel для ее отображения.На некоторых уровнях в моем дереве есть словари, на некоторых других уровнях списки.(Я не хочу TreeStore, потому что тогда мне нужно связать / скопировать вещи. Я хочу работать с исходными данными.)
Моя идея - использовать итератор словаря / списка при реализации метода on_get_iter()
.Для элемента верхнего уровня метод выглядит так (некоторый код пропущен):
def on_get_iter(self, path):
return self.__my_data.get_dict().iteritems()
Метод on_iter_next()
очень прост:
def on_iter_next(self, rowref):
try:
return rowref.next()
except StopIteration:
return None
Но тогда возникает необходимость получитьданные.Это сделано с on_get_value()
.Я понятия не имею, как это реализовать:
def on_get_value(self, rowref, column):
# What to write here?
В документации сказано, что значение текущей строки должно быть возвращено здесь.IMHO 'rowref.next ()' делает не то, потому что он получает не текущий, а следующий элемент.
IMHO нет способа получить доступ к текущему элементу итератора (см. PEP 234).
Есть ли способ использовать GenericTreeModel со стандартными итераторами, такими как словарь или итераторы списка?
Обновление: я нашел обходной путь для этого.Использование следующего итератора вместо стандартных работает для меня;конструктор получает стандартный итератор словаря / списка.
class GTMIterator:
def __init__(self, iterator):
self.__iterator = iterator
self.__current = None
self.next()
def next(self):
try:
self.__current = self.__iterator.next()
except StopIteration:
return None
return self.__current
def current(self):
return self.__current
Но: IMHO, это всего лишь обходной путь, а не «чистое» решение.