如何使用python gtk GenericTreeModel标准的dict / list迭代器?

时间:2012-03-21 07:43:31

标签: python iterator gtk

我在内存中有自己的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

但是:恕我直言,这只是一种解决方法,而不是一种“干净”的解决方案。

2 个答案:

答案 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.TreeItergtk.GenericTreeModel.create_tree_iter并在打电话时再打开 使用on_*的另一个gtk.GenericTreeModel.get_user_data函数。

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

答案 1 :(得分:-1)

您需要在数据保持对象中实现GtkTreeModel接口。 GtkTreeview使用任何实现该接口的GObject作为模型。

如需进一步参考,请查看 Overview of GtkTreeModel, GtkTreeView, and friends