如何在pyGTK中搜索gtk.ListStore并移除元素?

5 投票
2 回答
7201 浏览
提问于 2025-04-16 02:26

我有以下代码(这里的 store 是一个 gtk.ListStore,而 titer 是一个 gtk.TreeIter)。文档上说,如果没有下一行,iter_next() 会返回 None,所以当找到这个情况时就会跳出循环。这个代码的目的是在 ListStore 中查找一个包含 (int, str) 的项目,并删除那个 int 部分与 item_id 匹配的项目。

    while True:
        if store.get_path(titer)[0] == item_id:
            store.remove(titer)
            break
        else:
            titer = store.iter_next(titer)
            if titer is None:
                break

但是,如果中间的某个元素之前被删除了,titer.iter_next() 就不会指向下一个有效的元素,而是指向 None。这就意味着,如果要找的那个 int 值在之前被删除的元素之后,它就永远找不到。有没有正确的方法来遍历 gtk.ListStore 并删除项目呢?

2 个回答

2

简单检查一下:在你尝试搜索列表时,确保你的列表里有数据。

    column_number = 0
    search_term = 'foo'
    iter_child = tree_model.get_iter_first()
    tree_path = None
    while iter_child:
        if (tree_model.get_value(iter_child, column_number) == search_term):
            tree_path = tree_model.get_path(iter_child)
        iter_child = tree_model.iter_next(iter_child)

    view.row_activated(tree_path, column_number)
    view.set_cursor(tree_path, column_number, True)
11

我注意到的唯一错误是 store.get_path(titer)[0],这个代码只是获取了列表模型的行号。正确的写法应该是 store.get_value(titer, 0)

顺便说一下,你的代码可以用一种更简单的方式来表达,使用(仅限于PyGTK的) TreeModelRow

for row in store:
    if row[0] == item_id:
        store.remove(row.iter)
        break

撰写回答