从GtkListBox中删除非GtkListBoxRow父级

1 python gtk

关于我最近遇到过的事情,请快速说明.我使用python,但我想,它也适用于其他语言.

from gi.repository import Gtk

win = Gtk.Window()
listbox = Gtk.ListBox()
somewidget = Gtk.Somewidget()
win.add(listbox)

listbox.insert(somewidget -1)
listbox.remove(somewidget)  #ERROR
Run Code Online (Sandbox Code Playgroud)

这是一个GtkListBox,填充了一个非GtkListBoxRow类型的项目.当试图从GtkListBox中删除它时,它给了我以下内容:

Gtk-CRITICAL **: gtk_container_remove: assertion 'gtk_widget_get_parent (widget) == GTK_WIDGET (container) || GTK_IS_ASSISTANT (container) || GTK_IS_ACTION_BAR (container) || GTK_IS_POPOVER_MENU (container)' failed
Run Code Online (Sandbox Code Playgroud)

小智 5

问题是,GtkListBox必须只有GtkListBoxRow类型的子节点.(参见GTK doc)因此,当尝试插入另一个小部件时,会自动在其间添加一个GtkListBoxRow小部件:

+-----------------------------------+
|                                   |
| GtkListBox                        |
|  +                                |
|  +---> GtkListBoxRow (auto-added) |
|         +                         |
|         +---> Gtksomewidget       |
|                                   |
+-----------------------------------+
Run Code Online (Sandbox Code Playgroud)

如果您尝试删除自己的小部件,Gtk将失败,因为它需要ListBox的直接子级.所以不要使用

listbox.remove(somewidget)
Run Code Online (Sandbox Code Playgroud)

类型

listbox.remove(somewidget.get_parent())
Run Code Online (Sandbox Code Playgroud)