[SciPy-dev] Odd result from plt.IsShown()

Magnus Lyckå magnus at thinkware.se
Sat Nov 3 09:29:08 CST 2001


I'm using plt to display some x-y diagrams in a wxPython app,
and I update the plot when I shift or change my data if it's visible,
checking plt.IsShown(). This works as it should. When I close
the app, I also close the plot window if IsShown() returns true,
but sometimes this fails, which causes a Windows error message
when I try to close a non-existing window.

I start showing my data when I press a "Plot button" like this:

     def OnPlotButton(self, evt):
         #Construction of "age" and "y" lists snipped
         self.plot = plt.plot(age, y)
         plt.title(self.case.idNr)
         plt.xtitle('Age (years)')
         plt.ytitle('Height / Weight (cm /kg)')

This works OK. When I change data set, or modify my data
set, I do the following:

     if self.plot.IsShown():
         self.OnPlotButton(None)

This always works. If the diagram is showing, the data is
updated, but if it was closed, or never opened, no new plot
will be shown. In other words, IsShown() works as expected.
It always runs OnPlotButton when a plot window is open, and
it never starts a new window it it's closed. I'll have to
press the plot button again, just as I intended.

When I close the application, I run:

     def OnClose(self, event):
         self.db.close()
         print "Saving and exiting"
         try:
             print "In try block"
             if self.plot.IsShown():
                 print "In if..."
                 self.plot.Close()
                 print "After close"
             else:
                 print "In else"
         except:
             print "In except"
             pass
         event.Skip()

If I never used plot, all is fine. self.plot doesn't exist,
so I get an attribute error which I catch in my except clause,
printing "In except" before returning my prompt.

If the plot windows is active, it will close nicely.

If I have used plotting, closed the plot window and then changed
data set or modified the current data set before I close the app,
all is fine.

But if I close the plot window, and then close the app directly,
I get a crash on exit. The program prints "Saving and exiting",
and then "In if...", indicating that IsShown() quite unexpectedly
returned 1! I might have pressed my save button, or clicked away
in some other way after closing the plot window, but I haven't changed
data in such a way that there would have been a re-plot in case the
plot window had been open. I'm quite stunned here, because it seems
self.plot.IsShown() acts quite differently in the different places in
my code! (And yes, it's all in the same class. :-)

I can make my program available if someone would like to take a
closer look at it.

Another unexpected thing is that I get a Python prompt in the command
window where I started my app when I open my plot window! I can't
type anything in it, and it closes when I exit my app.

BTW, plot seems to leak memory. On a normal exit it says:
16:04:20: There were memory leaks.
16:04:20: ----- Memory dump -----
16:04:20: wxPrintData at $1B8E4E0, size 112
16:04:20: wxFont at $1B8EEF8, size 12
16:04:20: wxFont at $1B8D2C0, size 12
16:04:20: wxFont at $1B8C940, size 12
16:04:20: wxFont at $1B8C1D0, size 12
16:04:20: wxFont at $1B8B500, size 12
16:04:20: wxEvtHandler at $1B8A830, size 40
16:04:20: wxPyCallback at $1B88AB0, size 12
16:04:20: wxObject at $1B88A20, size 28
16:04:20:
16:04:20:
16:04:20: ----- Memory statistics -----
16:04:20: 1 objects of class wxObject, total size 28
16:04:20: 1 objects of class wxPyCallback, total size 12
16:04:20: 1 objects of class wxEvtHandler, total size 40
16:04:20: 5 objects of class wxFont, total size 60
16:04:20: 1 objects of class wxPrintData, total size 112
16:04:20:
16:04:20: Number of object items: 9
16:04:20: Number of non-object items: 0
16:04:20: Total allocated size: 252
16:04:20:
16:04:20:


--
Magnus Lyckå, Thinkware AB
Älvans väg 99, SE-907 50 UMEÅ
tel 070-582 80 65, fax: 070-612 80 65
http://www.thinkware.se/  mailto:magnus at thinkware.se




More information about the Scipy-dev mailing list