简要说明一下我最近遇到的事情。我使用了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())