Seite 1 von 1
Schliessen der Application abfangen...
Verfasst: Mittwoch 24. November 2010, 00:30
von Nebelhom
Hi,
ich versuche gerade in einer meiner Apps das "schliess-event" abzufangen, so dass das Programm noch hinter sich aufraeumen kann (temporaere Dateien loeschen). Im Menu und der Button "Exit" klappen wunderbar. Da fange ich das event wie gehabt ab.
Code: Alles auswählen
# grobes Beispiel
...
wx.EVT_MENU(self, wx.ID_CLOSE, self.onClose)
...
def onClose(self, event):
# still need to catch event when normally closed
.... Cleaning up after myself
sys.exit()
Leider geht das aber nicht so, wenn ich das Programm schliesse, in dem ich das tolle rote "X" rechts oben am Fenster klicke (in WinXP). Da das aber aus Gewohnheit die Methode ist mit der ich am ehesten Programme schliesse, wuerde ich gerne wissen, ob und wie man dieses event abfangen kann.
Koennte mir da jemand einen Hinweis oder zwoelf geben
Danke schonmal fuer die Hilfe.
Johannes
FYI: Ich benutze Python 2.6, wxPython 2.8 und das alles in Windows XP SP3. Wuerde es aber gerne mit *nix Systemen kompatibel machen.
Danke nochmal
Re: Schliessen der Application abfangen...
Verfasst: Mittwoch 24. November 2010, 09:58
von Gremlin
Das geht mit diesem Event:
http://docs.wxwidgets.org/stable/wx_wxc ... closeevent
Anwenden müsstest du das dann aber anders als in deinem Beispiel
Code: Alles auswählen
window.Bind(wx.EVT_CLOSE, self.onClose)
def onClose(self, event):
event.Skip()
Re: Schliessen der Application abfangen...
Verfasst: Mittwoch 24. November 2010, 23:57
von Nebelhom
Hi Gremlin,
danke fuer die hilfe. klappt jetzt wunderbar. Aufbauend auf dem obenerwaehnten Beispiel habe ich das event abgefangen und dabei dann meine Funktion ablaufen lassen.
Code: Alles auswählen
def onWindowExit(self, event):
event.Skip()
self.onClose()
Jetzt klappts so wie ich mir das vorgestellt habe

Re: Schliessen der Application abfangen...
Verfasst: Donnerstag 25. November 2010, 10:20
von Gremlin
Du weißt aber schon was "Skip()" macht, oder? Falls du dich in deiner Funktion "onClose()" nicht mehr auf irgendwelche wx Objekte beziehst passt das so, aber ansonsten wirst du schnell Bekanntschaft mit dem tollen "PyDeadObjectError" machen

Re: Schliessen der Application abfangen...
Verfasst: Donnerstag 25. November 2010, 11:04
von Nebelhom
Ich "denke", ich weiss was es macht
Skip(self, skip=True)
This method can be used inside an event handler to control whether further event handlers bound to this event will be called after the current one returns. Without Skip() (or equivalently if Skip(False) is used), the event will not be processed any more. If Skip(True) is called, the event processing system continues searching for a further handler function for this event, even though it has been processed already in the current handler.
Parameters:
skip
(type=bool)
Das hoert sich fuer mich relativ eindeutig an und ich sehe "aktuell" noch nicht, wie das in meinem fall ein problem sein koennte. Es waere nett, wenn du mich jedoch belehren koenntest
Hattest du an eine bestimmte situation gedacht, wo so etwas vorkommt?
Danke fuer deine Hilfe
Johannes
Re: Schliessen der Application abfangen...
Verfasst: Donnerstag 25. November 2010, 11:23
von Gremlin
Nebelhom hat geschrieben:Ich "denke", ich weiss was es macht
Gut

, worauf ich hinaus wollte, ist folgendes:
You should check whether the application is forcing the deletion of the window using wxCloseEvent::CanVeto. If this is false, you must destroy the window using wxWindow::Destroy. If the return value is true, it is up to you whether you respond by destroying the window.
If you don't destroy the window, you should call wxCloseEvent::Veto to let the calling code know that you did not destroy the window. This allows the wxWindow::Close function to return true or false depending on whether the close instruction was honoured or not.
Wer also das "CloseEvent" nutzt, muss entweder selbst dafür sorgen, dass das Mainframe unter genannten Bedingungen "zerstört" wird oder eben "Skip()" aufrufen, damit das Basisevent sich darum kümmern kann. Man könnte sicherlich auch "window.Destroy()" statt "Skip()" aufrufen, aber das hab ich noch nie ausprobiert.
Aber Tatsache bleibt, wenn du "Skip()" vor deiner Funktion aufrufst, kannst du nicht sicherstellen, dass dein Mainframe inkl. aller Objekte auch wirklich die ganze Zeit noch vorhanden ist während deine Funktion noch arbeitet. Und das betrifft in gewisser Weise alle "Skip()"-Aufrufe, unabhängig vom Event, würde ich mal behaupten.

Re: Schliessen der Application abfangen...
Verfasst: Donnerstag 25. November 2010, 12:31
von Nebelhom
Dem ist wohl nichts mehr hinzuzufuegen
Das ist echt nuetzlich zu wissen, weil ich bin mir sicher, das waere eins dieser nicht vorhergesehenen Verhalten an denen ich dann mehrere Tage sitzen wuerde ohne zu verstehen, was da jetzt wirklich falsch laeuft
Danke fuer deine Hilfe.