问题描述
|
我在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都会导致该行重新检查其信息,因此基础函数应该只是一个查找函数,而不是密集的计算。实际上,由于这个原因,您可以不用执行“连接到信号/更改行”的程序,但是我个人会更好地知道不会有任何极端情况。