Skip to main content
 首页 » 编程设计

python之从 GtkListBox 中移除非 GtkListBoxRow 父级

2025年05月04日36zhwl

简单记一下我最近遇到的事情。我使用 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 类型的 child 。 (参见 GTK doc)因此,当尝试插入另一个小部件时,会自动在其间添加一个 GtkListBoxRow 小部件:

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

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

listbox.remove(somewidget) 

类型

listbox.remove(somewidget.get_parent())