我正在寻找一种方法来从其父级中删除一个小部件(无论可能是什么 - 一个VBox,一个网格......)并在其位置添加一个替代小部件。
我找到了this answer,但我似乎无法使用Gtk3。
这是我尝试的内容:
from gi.repository import Gtk
def replace_widget(old, new):
parent= old.get_parent()
props= {}
for key in Gtk.ContainerClass.list_child_properties(type(parent)):
props[key.name]= parent.child_get_property(old, key.name)
parent.remove(old)
parent.add_with_properties(new, **props)
但是对Gtk.ContainerClass.list_child_properties
的调用会引发
TypeError: argument self: Expected a Gtk.ContainerClass, but got gi.repository.Gtk.GObjectMeta
它也不会接受容器小部件的实例。对于我的生活,我无法弄清楚我应该通过什么参数。
P.S。:我知道我可以在容器和子窗口小部件之间添加另一个窗口小部件,但我不想这样做。
更新:我想它还不够清楚:替代小部件应与原始小部件位于同一位置,具有相同的打包属性。
答案 0 :(得分:2)
由于PyGObject 3.14:https://git.gnome.org/browse/pygobject/commit/?h=pygobject-3-14&id=bf84915f89fd5fd502b4fb162eef7bc0a48c8783
,这种情况最近才成为可能以下任何一种都可以在PyGObject 3.14及更高版本中使用:
parent.list_child_properties()
Gtk.ContainerClass.list_child_properties(parent)
(第二种语法是在类和实例方法有命名冲突的情况下。参见讨论here。)
答案 1 :(得分:2)
感谢ptomato's answer提供的信息,以下是工作代码:
def replace_widget(old, new):
parent = old.get_parent()
props = {}
for key in Gtk.ContainerClass.list_child_properties(type(parent)):
props[key.name] = parent.child_get_property(old, key.name)
parent.remove(old)
parent.add(new)
for name, value in props.iteritems():
parent.child_set_property(new, name, value)
答案 2 :(得分:0)
我知道它如何与C一起工作,我没有尝试使用python:
parent = gtk_widget_get_parent(old);
g_object_ref(_key); /** because gtk_container_remove remove the widget with its reference we have to increment the number of reference if we want to reuse the old widget **/
gtk_container_remove(GTK_CONTAINER(parent), old);
gtk_container_add(GTK_CONTAINER(parent), new);
PS:在VBox或Grid的情况下,小部件没有插入到旧的位置,你必须指定插入的位置(旧的whild的位置)
祝你好运,答案 3 :(得分:-1)
您可以尝试使用Gtk.Widget的reparent()
方法。您可以在此link查看文档。如果我记得很清楚你应该首先重新显示子窗口小部件,然后删除旧的父窗口小部件。如果它没有在评论中发布,我会检查我的文档(目前不在该机器上)。