Seite 1 von 1

Aktionen durchführen bei Programmende ?

Verfasst: Mittwoch 2. Mai 2007, 13:22
von Bruno Schäfer
Wie kann ich, wenn ich mein Programm über das Systemmenü in der Fenstertitelseite beende, d.h. wenn ich auf das Kreuzchen im Quadrat klicke (ich verwende Tkinter und Windows!), mein Programm veranlassen, dass es noch vor dem Ende eine Aktion durchführt, z.B. irgendwelche Daten abspeichert ?

Wenn ich versuche Daten hinter "tk.mainloop()" abzuspeichern, kommt eine Fehlermeldung:

"D:\Python25\lib\lib-tk\Tkinter.py", line 2962, in get
return self.tk.call(self._w, 'get', index1, index2)
TclError: invalid command name ".19197344.19197624.19182056.19182136"



Gruß
B.S.

Verfasst: Mittwoch 2. Mai 2007, 14:04
von joost
Is n'bisschen her, dass ich TKinter verwendet habe (und so was nie gemacht). gtk hat für jedes widget gleich zwei Events: delete und destroy (nach delete abgesendet). Und TKinter wirklich gar nichts, nicht einmal für Toplevels ?

Workaround: Du produzierst eine 'bewachte' Variable und änderst deren Wert nur einmal - direkt vor Programmende.
___________________
Schlechte Software ist schlimmer als keine Software

Verfasst: Mittwoch 2. Mai 2007, 18:42
von pyStyler
Hi,

"WM_DELETE_WINDOW" ist dein Freund.
ein beispiel.

Code: Alles auswählen

import Tkinter as tk

class App( tk.Frame ):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.master = master
        b = tk.Button(self, text='Quit', command=self.onQuit)
        b.pack(expand=tk.YES, fill=tk.BOTH)
        
        
        self.master.protocol('WM_DELETE_WINDOW', self.onQuit)
        
    def onQuit(self):
        
        self.master.quit()

def _main():
    root = tk.Tk()
    app = App( root )
    app.pack(expand=tk.YES, fill=tk.BOTH)
    root.mainloop()
    
if __name__=='__main__':
    _main()
Gruss
pyStyler

Genau das habe ich gesucht !

Verfasst: Mittwoch 2. Mai 2007, 20:13
von Bruno Schäfer
Hallo pyStyler,

Danke für den Tipp.
Genau das habe ich gesucht !

Ich habe aber zwischenzeitlich bei Fredrik Lundh in
"An Introduction to Tkinter " auf http://www.pythonware.com
genau dieses 'WM_DELETE_WINDOW' gefunden.
Man muss halt mehr Geduld beim Suchen haben !

Danke trotzdem und
Gruß
B.S.

Verfasst: Donnerstag 3. Mai 2007, 11:00
von joost
Ähmm, das mit der 'bewachten Variablen' oben war nix. :oops:

Übrigens hat jedes Widget ein Destroy-Event, siehe
http://infohost.nmt.edu/tcc/help/pubs/t ... types.html

___________________
Schlechte Software ist schlimmer als keine Software