Skip to main content
 首页 » 编程设计

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

2025年05月04日11del

我在内存中有自己的树状数据结构,想使用 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 方法可以存储访问它以防万一 调用其他方法时需要。