Я ищу способ удалить виджет из его родителя (независимо от того, что может быть - VBox, Grid,...) и добавить вместо него замещающий виджет.
Я нашел этот ответ, но я не могу заставить его работать с 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.: Я знаю, что я мог добавить еще один виджет между контейнером и дочерним виджетами, но я бы предпочел не делать этого.
ОБНОВЛЕНИЕ: Я предполагаю, что это было недостаточно ясно: замещающий виджет должен находиться в том же месте, что и исходный виджет, с теми же свойствами упаковки.
Благодаря ptomato, здесь рабочий код:
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)