wxPython: accessing wxFrame methods in __del__ fails

Alex VanderWoude nospam at biteme.com
Fri Mar 25 00:59:54 EST 2005


"Stephen Thorne" <stephen.thorne at gmail.com> wrote in message
news:mailman.802.1111645725.1799.python-list at python.org...
> On Thu, 24 Mar 2005 06:21:36 GMT, Alex VanderWoude <nospam at biteme.com>
wrote:
> > I am attempting to save my window's size and position when it closes.
So I
> > figured I'd put some code in the __del__() method:
> >
> > from wxPython import *
> > class MyWindow(wxFrame):
> >     def __init__(self, parent, id=wxID_ANY, title=None, style=None):
> >         # Some stuff here.
> >     def __del__(self):
> >         x, y = self.GetPositionTuple()
> >         width, height = self.GetSizeTuple()
> >         # Store the values in a file or something.
> >         wxFrame.__del__(self)
> >
> > However, when I run this code I end up with an unhandled exception on
the
> > first line in __del__().  Apparently you can't call GetPositionTuple()
(or
> > GetSizeTuple() for that matter) in __del__().  I'm confused by this,
because
> > I thought that __del__() was called before the object was actually
> > destroyed.  I can still do a dir(self), so obviously not everything
> > associated with my instance is gone.  Or does that work because it's
part of
> > the class, not just my instance?  Any insight into this would be greatly
> > appreciated.
>
> Don't use __del__, use EVT_CLOSE
>
> i.e.
> self.Bind(wx.EVT_CLOSE, self.OnClose)
>
> and
>
> def OnClose(self, evt):
> x, y = self.GetPositionTuple()
>
> --
> Stephen Thorne
> Development Engineer

Thanks for the tip.  There doesn't seem to be an equivalent EVT_OPEN, so I
guess I'll continue to use __init__.  That works fine.

One thing I noticed in my OnClose() event handler is that I must add a
Skip() command to pass the event futher up the chain, otherwise the app
doesn't actually close!  Furthermore, if an exception occurs during my
processing then the close is cancelled, so I also had to wrap my command in
a try block:

def OnClose(self, event):
    try:
        self.SaveFrameSettings()
    finally:
        event.Skip()

- Alex






More information about the Python-list mailing list