Seite 1 von 1

Widget aus Glade, zerstören, und wieder anzeigen

Verfasst: Freitag 27. Februar 2009, 21:29
von gugugs
Ich hole mir ein Fenster aus einer Glade datei, diesen Widget rufe ich dann auf mit ".show_all()" so wie immer eben, wenn ich das Fenster dann zerstöre also ".destroy()", wie kann ich es dann wieder aufrufen? Denn mit ".show_all()" geht es dann nicht mehr. Muss ich es neu definieren? Denn das geht dann irgendwie auch nicht.

Wollte es erst nur mit ".show_all()" und ".hide_all()" machen, aber egal ob ich das "destroy" Signal abfange und in einer Funktion dann ".hide_all()" schreibe, zerstört er es trotzdem.

Ich hoffe, es ist einigermaßen verständlich, wie ich es meine :)

Danke

Verfasst: Freitag 27. Februar 2009, 21:45
von Trundle
Das "destroy-event"-Signal ist zu spät, da wird das Widget bereits zerstört. Du musst das "delete-event"-Signal behandeln. Oder, wenn du wirklich ein neues Widget willst, die Glade-Datei noch einmal laden.

Verfasst: Freitag 27. Februar 2009, 21:54
von gugugs
Geht immer noch nicht, muss ich vllt irgendetwas unterbinden?
Ich hätte es jetzt so vor:

Code: Alles auswählen

self.window=self.xml.get_widget("Netzwerktest")
self.window.connect("delete-event", lambda w: self.window.hide_all())
Aber so geht es noch nicht.

Verfasst: Freitag 27. Februar 2009, 21:58
von Trundle
Der Handler muss `True` zurückgeben, damit das Signal nicht weiter verbreitet wird (sonst wird irgendwann ja der Default-Handler aufgerufen, der das Widget zerstört).

Verfasst: Freitag 27. Februar 2009, 22:01
von gugugs
Ah, ok, klingt logisch, kann ich das irgendwie in das lambda einbauen? Oder muss ich eine extra Funktion machen?

Verfasst: Freitag 27. Februar 2009, 22:06
von Trundle
``self.window.hide_all() or True`` würde wohl funktionieren.

Verfasst: Freitag 27. Februar 2009, 22:15
von gugugs
Hä? ich steh mal wieder ein bisschen auf m Schlauch, so oder was?

Code: Alles auswählen

self.window=self.xml.get_widget("Netzwerktest")
self.window.connect("delete-event", lambda w: self.window.hide_all() or True)
^^

edit: Hier habe ich das Problem auch noch mal gesehen http://www.daniweb.com/forums/thread176389.html

genau das ist das Problem, leider hat ihm noch niemand geantwortet

Verfasst: Samstag 28. Februar 2009, 00:14
von Trundle
Ist es denn so schwer, einfach einmal selber Dinge auszuprobieren oder einen Blick in die Dokumentation zu werfen? Dass man hier Fragen stellt geht ja in Ordnung, man ist ja auch bemüht zu antworten, aber ein klein wenig darf man doch erwarten, dass mitgedacht wird, dass man grundlegende Dinge der Sprache weiß und dass man auch vorgeschlagene Lösungen nicht einfach hinnimmt, sondern dass versucht wird, diese zu verstehen, beispielsweise mit Hilfe der Dokumentation.

Ein Blick in die Dokumentation offenbart dir, dass den Callbacks vom "delete-event"-Signal eben zwei Argumente übergeben werden, nämlich das Widget, das "gelöscht" werden soll und eben das Event, das das Signal ausgelöst hat. Das bringt uns also dazu, dass dein toller Code wohl irgendwie so aussehen muss:

Code: Alles auswählen

self.window = self.xml.get_widget("Netzwerktest")
self.window.connect("delete-event", lambda w, e: self.window.hide_all() or True)
Und mit ``self.window.show_all()`` ist dann alles wieder da. Das war doch jetzt gar nicht so schwer, oder?