我有一个ListStore in PyGTK,它有很多行。有一个后台作业处理由行表示的数据,当它完成时,它需要更新行。当然,要做到这一点,它需要知道要更新哪一行,因此需要保留一个迭代器。但是,在后台作业生命周期中,用户可能会删除该行。这样就可以了--我们只需将存储的迭代器替换为"None",后台工作就会继续愉快地进行下去。问题是,当行被移除时,迭代器不会进行相等的比较,并且没有任何设置为None。事实上,没有两个迭代器,AFAIK,比较相等。在最小的例子中,问题是:
>>> store = gtk.ListStore(int)
>>> store.insert(1)
<GtkTreeIter at 0x1d49600>
>>> print store[0].iter == store[0].iter
False假的,但他们是同一个迭代器!(我知道它们是不同的实例,但是它们代表着相同的东西,它们定义了一个__eq__方法。)这里遗漏了什么,以及如何跟踪ListStore中的行以供以后更新?
发布于 2011-05-19 22:51:03
尝试使用列表存储的.get_path(iter)方法,比较结果路径,而不是直接比较迭代器。
更新:您可以使用无效的set_value调用iter。gtk会给你一个警告,但不会抛出异常或任何东西。它可能只是检查它是否有效的iter无论如何。
发布于 2011-05-20 02:10:12
我会以不同的方式对待这一问题--以下是我在类似情况下所做的工作:
每个行中表示的底层数据对象是GObject
GObject子类的一个实例,它具有一组properties
notify::myproperty信号同时:
notify::myproperty
ListStore存储这些对象,并使用gtk.TreeViewColumn.set_cell_data_func()方法为每个对象/行呈现每一列(见下面的注释)
notify::...信号的TreeView函数的对象触发了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))我将hids保存在列表中,以便在清除表时断开它们的连接。如果允许删除单个行,则可能需要将它们存储在映射中(路径-> hid,或object -> hid)。
注意:您需要记住,每次重绘时,set_cell_data_func都会导致行重新检查其信息,因此底层函数应该只是一个查找函数,而不是密集的计算。实际上,由于这一点,您可以不做“连接到信号/发射行更改”的程序,但我个人感觉更好,因为我知道不会有任何边缘情况。
https://stackoverflow.com/questions/6065525
复制相似问题