从Gtk TreeStore中删除多行

时间:2015-01-13 19:08:38

标签: treeview gtk3 pygobject

我正在尝试从Gtk.TreeStore中删除多行:

        data_selection = data_treeview.get_selection()
        data_model, data_row_list = data_selection.get_selected_rows()

        treeiter_list = []

        for treepath in data_row_list:
            row = data_model[treepath]
            treeiter_list.append(data_model.get_iter(row))

        for treeiter in treeiter_list:
            data_treestore.remove(treeiter)

如果我只选择一行,这是有效的。一旦我选择了多个,我就会收到此错误:

  

Gtk-CRITICAL **:gtk_list_store_remove:断言'iter_is_valid(iter,list_store)'失败

删除第一行后,树木成为无效吗?

1 个答案:

答案 0 :(得分:3)

  
    
      

删除第一行后,树木成为无效吗?

    
  

是。如果删除了一行,树路径也会改变。

关键是以相反的顺序删除树路径,因此路径仍然有效。也不要存储iters,改用路径并在循环中调用iter,不需要双循环。

示例的关键部分:

selection = self.view.get_selection()
model, paths = selection.get_selected_rows()
for p in reversed(paths):
    itr = model.get_iter(p)
    model.remove(itr)

完整示例可在以下网址找到:

https://gist.github.com/carlos-jenkins/c4fedad66169b75424a0

请注意,如果模型不是排序模型,这将起作用。如果是,您需要打电话 convert_iter_to_child_iter以便删除它。

https://developer.gnome.org/gtk3/3.14/GtkTreeModelSort.html#gtk-tree-model-sort-convert-iter-to-child-iter