我在内存中有自己的tree-isch数据结构,想要使用 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
但是:恕我直言,这只是一种解决方法,而不是一种“干净”的解决方案。
答案 0 :(得分:0)
执行此操作的方法之一如下:
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
并在打电话时再打开
使用on_*
的另一个gtk.GenericTreeModel.get_user_data
函数。
因此,返回的键和值不是仅返回python迭代器
通过最后一次调用next
方法可以存储以访问它,以防万一
在调用其他方法时需要。
答案 1 :(得分:-1)
您需要在数据保持对象中实现GtkTreeModel接口。 GtkTreeview使用任何实现该接口的GObject作为模型。
如需进一步参考,请查看 Overview of GtkTreeModel, GtkTreeView, and friends