关于我最近遇到过的事情,请快速说明.我使用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)