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

07-26 02:05