pygtk GtkTreeIter比较

问题描述

| 我在PyGTK中有一个ListStore,其中有一堆行。有一个后台作业处理行所代表的数据,完成后,它需要更新行。当然,要做到这一点,它需要知道要更新哪一行,并因此保持迭代器遍历该行。但是,在后台作业期间,用户可能会删除该行。没关系-我们只用\“ None \”替换存储的迭代器,后台工作就会继续进行。问题在于,当删除该行时,迭代器的比较结果并不相等,并且没有任何内容设置为None。实际上,没有两个迭代器AFAIK比较相等。在一个最小的示例中,问题是:
>>> store = gtk.ListStore(int)
>>> store.insert(1)
<GtkTreeIter at 0x1d49600>
>>> print store[0].iter == store[0].iter
False
错误,但是它们是相同的迭代器! (我知道它们是不同的实例,但是它们代表相同的事物,并且它们定义了
__eq__
方法。)我在这里遗漏了什么?如何跟踪ListStore中的行以便以后进行更新?     

解决方法

尝试使用列表存储的
.get_path(iter)
方法,比较结果路径,而不是直接比较迭代器。 更新:您可以仅以无效的
iter
呼叫
set_value
gtk
会警告您,但不会引发异常或任何其他情况。无论如何,它可能只是检查它是否是有效的迭代器。     ,我会采取不同的方法-这是我在类似情况下所做的事情: 每行中表示的基础数据对象是“ 6”的实例
GObject
子类具有许多特性 当属性更改时,它会发出“ 8”信号 同时: 我的
ListStore
存储这些对象,并使用
gtk.TreeViewColumn.set_cell_data_func()
方法渲染每一列(请参见下面的注释) 对于每个对象/行,我管理
TreeView
的对象连接到
notify::myproperty
与此
notify::...
信号连接的功能会触发
ListStore
上的
row-changed
信号 一些代码:
def on_myprop_changed(self,iter,prop):
    path = self.model.get_path(iter)
    self.model.row_changed(path,iter)

def on_thing_processed(self,thingdata):
    # Model is a ListStore
    tree_iter = self.model.append((thingdata,))

    # You might want to connect to many \'notify::...\' signals here,# or even have your underlying object emit a single signal when
    # anything is updated.
    hid = thingdata.connect_object(\'notify::myprop\',self.on_myprop_changed,tree_iter)
    self.hids.add((thingdata,hid))
我将隐藏项保留在列表中,以便在清除表时可以断开它们的连接。如果您要删除各个行,则可能需要将它们存储在地图中(路径->隐藏,或对象->隐藏)。 注意:您需要记住,每次重绘时,ѭ17都会导致该行重新检查其信息,因此基础函数应该只是一个查找函数,而不是密集的计算。实际上,由于这个原因,您可以不用执行“连接到信号/更改行”的程序,但是我个人会更好地知道不会有任何极端情况。