Gtk3用另一个小部件替换子小部件

时间:2014-12-07 13:34:41

标签: python gtk gtk3

我正在寻找一种方法来从其父级中删除一个小部件(无论可能是什么 - 一个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。:我知道我可以在容器和子窗口小部件之间添加另一个窗口小部件,但我不想这样做。

更新:我想它还不够清楚:替代小部件应与原始小部件位于同一位置,具有相同的打包属性。

4 个答案:

答案 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查看文档。如果我记得很清楚你应该首先重新显示子窗口小部件,然后删除旧的父窗口小部件。如果它没有在评论中发布,我会检查我的文档(目前不在该机器上)。