Ich suche nach einer Möglichkeit, ein Widget von seinem Elternteil zu entfernen (was auch immer das sein mag - eine VBox, ein Grid, ...) und an seiner Stelle ein Ersatz-Widget hinzuzufügen.Gtk3 ersetze untergeordnetes Widget durch ein anderes Widget
Ich fand this answer, aber ich kann nicht scheinen, es mit Gtk3 arbeiten zu lassen.
Hier ist, was ich versucht:
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)
Aber der Aufruf von Gtk.ContainerClass.list_child_properties
wirft
TypeError: argument self: Expected a Gtk.ContainerClass, but got gi.repository.Gtk.GObjectMeta
Es wird nicht eine Instanz eines Container-Widget entweder akzeptieren. Für das Leben von mir kann ich nicht herausfinden, welchen Parameter ich übergeben soll.
P.S .: Ich weiß, ich könnte ein weiteres Widget zwischen dem Container und dem Kind Widget hinzufügen, aber ich würde es lieber nicht.
UPDATE: Ich denke, es war nicht klar genug: Das Ersatz-Widget soll an der gleichen Stelle wie das ursprüngliche Widget sein, mit den gleichen Packeigenschaften.
Dank ptomato, hier ist der Arbeitscode:
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)
Hier ist ein Beispiel, wie es mit einer Treeview zu tun: http://stackoverflow.com/questions/27747172/remove-widget-from-gtk-viewport-scrolled- Fenster-in-Dynamik-GUI – tobias47n9e