如何在pyGTK中搜索gtk.ListStore并移除元素?
我有以下代码(这里的 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