Schliessen der Application abfangen...

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

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
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

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()
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

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 :D
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

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 :P
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

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
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Nebelhom hat geschrieben:Ich "denke", ich weiss was es macht
Gut :lol: , 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. :roll:
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

Dem ist wohl nichts mehr hinzuzufuegen :D

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.
Antworten