2014-12-07 7 views
13

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) 
+0

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

Antwort

0

ich weiß, wie es mit C arbeitet, habe ich versuche, es nicht mit 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: in der Bei einer VBox oder einem Grid wird das Widget nicht an der Stelle des alten eingefügt, sondern Sie müssen die Einfügeposition angeben (die Position des alten Whilds)

viel Glück,

0

Sie können reparent() Methode von Gtk.Widget versuchen. Sie können Dokumente unter dieser link überprüfen. Wenn ich mich gut erinnere, sollten Sie zunächst das Kind-Widget und dann das alte Eltern-Widget erneut behandeln. Wenn es nicht funktioniert Post in Kommentar und ich werde meine Dokumente überprüfen (derzeit nicht auf dieser Maschine sry).

+0

Bitte poste hier nicht nur Links. Bitte kopieren Sie die Methode, auf die Sie verweisen. –

+0

Sry, ich bin ein bisschen verwirrt. Warum ist eine Verknüpfung zulässig, wenn dies nicht erwünscht ist? Der Methodenname ist reparant() – cyberbrain

+0

Linking ist für zusätzliche Information. Sie sollten etwas tun wie: Versuchen Sie diese Methode: 'reparent()' finden Sie unter diesem Link für weitere Informationen. –

Verwandte Themen