我在内存中有自己的树状数据结构,想使用 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?
文档说,当前行的值应该是 回到这里。恕我直言,“rowref.next()”做错了事,因为它 不获取当前元素,而是获取下一个元素。
恕我直言,无法访问迭代器的当前元素(请参阅 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
但是:恕我直言,这只是一种解决方法,而不是“干净”的解决方案。
请您参考如下方法:
一种方法如下:
def on_get_iter(self, path):
...
iterator = self.__my_data.get_dict().iteritems()
data = iterator.next()
return {'iterator': iterator, 'data': data}
def on_iter_next(self, rowref):
try:
iterator = rowref['iterator']
next_data = iterator.next()
return {'iterator': iterator, 'data': next_data}
except StopIteration:
return None
def on_get_value(self, rowref, column):
key, value = rowref['data']
return value[column]
这里的关键是 on_* 函数可以返回任何用户数据对象 他们希望。该对象自动包装在 gtk.TreeIter 中,使用 gtk.GenericTreeModel.create_tree_iter 并在调用时再次展开 另一个使用 gtk.GenericTreeModel.get_user_data 的 on_* 函数。
因此,不是只返回一个 python 迭代器,而是返回键和值 通过最后一次调用 next 方法可以存储访问它以防万一 调用其他方法时需要。
