首页
学习
活动
专区
圈层
工具
发布

pygtk比较
EN

Stack Overflow用户
提问于 2011-05-19 22:25:37
回答 2查看 486关注 0票数 1

我有一个ListStore in PyGTK,它有很多行。有一个后台作业处理由行表示的数据,当它完成时,它需要更新行。当然,要做到这一点,它需要知道要更新哪一行,因此需要保留一个迭代器。但是,在后台作业生命周期中,用户可能会删除该行。这样就可以了--我们只需将存储的迭代器替换为"None",后台工作就会继续愉快地进行下去。问题是,当行被移除时,迭代器不会进行相等的比较,并且没有任何设置为None。事实上,没有两个迭代器,AFAIK,比较相等。在最小的例子中,问题是:

代码语言:javascript
复制
>>> store = gtk.ListStore(int)
>>> store.insert(1)
<GtkTreeIter at 0x1d49600>
>>> print store[0].iter == store[0].iter
False

假的,但他们是同一个迭代器!(我知道它们是不同的实例,但是它们代表着相同的东西,它们定义了一个__eq__方法。)这里遗漏了什么,以及如何跟踪ListStore中的行以供以后更新?

EN

回答 2

Stack Overflow用户

发布于 2011-05-19 22:51:03

尝试使用列表存储的.get_path(iter)方法,比较结果路径,而不是直接比较迭代器。

更新:您可以使用无效的set_value调用itergtk会给你一个警告,但不会抛出异常或任何东西。它可能只是检查它是否有效的iter无论如何。

票数 0
EN

Stack Overflow用户

发布于 2011-05-20 02:10:12

我会以不同的方式对待这一问题--以下是我在类似情况下所做的工作:

每个行中表示的底层数据对象是GObject

  • This GObject子类的一个实例,它具有一组properties

  • When属性更改,它发出notify::myproperty信号

同时:

notify::myproperty

  • The

  • my ListStore存储这些对象,并使用gtk.TreeViewColumn.set_cell_data_func()方法为每个对象/行呈现每一列(见下面的注释)

  • ,我的对象管理到连接到此notify::...信号的TreeView函数的对象触发了ListStore

上的row-changed信号

一些代码:

代码语言:javascript
复制
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都会导致行重新检查其信息,因此底层函数应该只是一个查找函数,而不是密集的计算。实际上,由于这一点,您可以不做“连接到信号/发射行更改”的程序,但我个人感觉更好,因为我知道不会有任何边缘情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6065525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档