从 GtkListBox 中移除非 GtkListBoxRow 父级

Remove non-GtkListBoxRow parent from GtkListBox

简单记一下我最近遇到的事情。我使用 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

这是一个 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

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

+-----------------------------------+
|                                   |
| GtkListBox                        |
|  +                                |
|  +---> GtkListBoxRow (auto-added) |
|         +                         |
|         +---> Gtksomewidget       |
|                                   |
+-----------------------------------+

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

listbox.remove(somewidget)

类型

listbox.remove(somewidget.get_parent())