gpt4 book ai didi

python - 如何将标准字典/列表迭代器与 python gtk GenericTreeModel 一起使用?

转载 作者:太空宇宙 更新时间:2023-11-04 06:43:15 32 4
gpt4 key购买 nike

我在内存中有自己的树状数据结构,想使用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_dataon_* 函数。

因此,不是只返回一个 python 迭代器,而是返回键和值通过最后一次调用 next 方法可以存储访问它以防万一调用其他方法时需要。

关于python - 如何将标准字典/列表迭代器与 python gtk GenericTreeModel 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9800440/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com