Widget aus Glade, zerstören, und wieder anzeigen

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

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
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

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.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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).
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Ah, ok, klingt logisch, kann ich das irgendwie in das lambda einbauen? Oder muss ich eine extra Funktion machen?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

``self.window.hide_all() or True`` würde wohl funktionieren.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

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
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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?
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Antworten