Unerwartete Ausgabe von self.window.get_position()

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
atarax
User
Beiträge: 44
Registriert: Samstag 14. Juni 2008, 22:49
Wohnort: Berlin
Kontaktdaten:

Das Programm, an dem ich schreibe, soll beim Schließen des Fensters die Fenstergröße und -position speichern können, um beim nächsten Aufruf das Fenster an gleicher Stelle wieder zu öffnen, wie es zuvor geschlossen wurde. Leider erhalte ich nicht die richtigen Werte, wie das Skript veranschaulichen soll.

Wenn der Button geklickt wird, dann erhalte ich die richtigen Werte, aber nicht, wenn ich das Fenster schließe. Hat jemand eine Idee, woran das liegen kann und was ich tun kann, damit ich beim Schließen des Fensters die gleichen Werte bekomme wie beim Klicken auf den Button?

Vielen Dank.

Code: Alles auswählen

#!/usr/bin/python
#-*- coding: utf-8 -*-
 
import gtk
 
class Test(object):
    
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect("destroy", self.destroy)
        self.window.show()
        self.widGoButton = gtk.Button("Position anzeigen")
        self.widGoButton.connect("clicked", self.actGoButton)
        self.widGoButton.show()
        self.window.add(self.widGoButton)
    
    def actGoButton(self, widget):
        self.readSettings(self)  # liefert richtige Werte
        self.saveSettings(self)
    
    def readSettings(self, data=None):
        self.winPosition = self.window.get_position()
        self.winSize = self.window.get_size()
    
    def saveSettings(self, data=None):
        print
        print "self.window.get_position() =", self.winPosition
        print "self.window.get_size() =", self.winSize
 
    def destroy(self, data=None):
        self.readSettings(self)  # liefert falsche Werte
        self.saveSettings(self)
        gtk.main_quit()
 
    def main(self):
        gtk.main()
 
if __name__ == "__main__":
    test = Test()
    test.main()
http://www.decocode.de/
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Beim "destroy" ist das Fenster schon zerstört, logischerweise werden dann nicht mehr die gewünschten Werte ausgelesen.
Für deinen Anwendungsfall willst du das "delete_event". Dieses ist außerdem bereits im "Hello World"-Beispiel beschrieben. ;) http://www.pygtk.org/pygtk2tutorial/ch- ... arted.html
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
atarax
User
Beiträge: 44
Registriert: Samstag 14. Juni 2008, 22:49
Wohnort: Berlin
Kontaktdaten:

Super, vielen Dank! Die Methode delete_event hatte ich entfernt, weil ich nicht erkennen konnte, wozu sie taugt. Jetzt habe ich sie wieder eingefügt und es klappt:

Code: Alles auswählen

def delete_event(self, widget, event, data=None):
        self.readSettings(self)
        self.saveSettings(self)
        return False
http://www.decocode.de/
BlackJack

@atarax: Warum übergibst Du da `self` wenn Du dann doch nichts damit machst!? Zumal das Objekt selbst ja sowieso schon als erstes übergeben wird, da es sich im Methoden handelt.
Benutzeravatar
atarax
User
Beiträge: 44
Registriert: Samstag 14. Juni 2008, 22:49
Wohnort: Berlin
Kontaktdaten:

@BlackJack:
Weil ich ein blutiger Anfänger bin und das mit den Klassen, Methoden und dem self noch nicht ganz begriffen habe. Aber ich bin schon froh, wenn mein Skript das macht, was es tun soll, auch wenn es nicht so elegant ist. Ich lerne noch...
http://www.decocode.de/
Antworten