Revision: 8424
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8424&view=rev
Author:   efiring
Date:     2010-06-13 21:04:14 +0000 (Sun, 13 Jun 2010)

Log Message:
-----------
[3015013] use atexit in _pylab_helpers to ensure orderly shutdown.

It closes all windows; in the case of Tk, this calls the root.destroy()
function, which should prevent the PyEval_RestoreThread error on Win.  See
http://mail.python.org/pipermail/python-bugs-list/2002-November/014207.html

This changeset also refactors the close() functionality into
three Gcf methods, fixing a bug (or inconsistency) in which calling
close with a figure number failed to call mpl_disconnect.

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/_pylab_helpers.py
    trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py
    trunk/matplotlib/lib/matplotlib/backends/backend_tkagg.py
    trunk/matplotlib/lib/matplotlib/pyplot.py

Modified: trunk/matplotlib/lib/matplotlib/_pylab_helpers.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/_pylab_helpers.py   2010-06-12 23:40:19 UTC 
(rev 8423)
+++ trunk/matplotlib/lib/matplotlib/_pylab_helpers.py   2010-06-13 21:04:14 UTC 
(rev 8424)
@@ -4,8 +4,12 @@
 
 import sys, gc
 
+import atexit
+import traceback
+
+
 def error_msg(msg):
-    print >>sys.stderr, msgs
+    print >>sys.stderr, msg
 
 class Gcf(object):
     """
@@ -34,10 +38,10 @@
         If figure manager *num* exists, make it the active
         figure and return the manager; otherwise return *None*.
         """
-        figManager = Gcf.figs.get(num, None)
-        if figManager is not None:
-            Gcf.set_active(figManager)
-        return figManager
+        manager = Gcf.figs.get(num, None)
+        if manager is not None:
+            Gcf.set_active(manager)
+        return manager
 
     @staticmethod
     def destroy(num):
@@ -48,22 +52,36 @@
         window "destroy" and "delete" events.
         """
         if not Gcf.has_fignum(num): return
-        figManager = Gcf.figs[num]
+        manager = Gcf.figs[num]
+        manager.canvas.mpl_disconnect(manager._cidgcf)
 
         # There must be a good reason for the following careful
         # rebuilding of the activeQue; what is it?
         oldQue = Gcf._activeQue[:]
         Gcf._activeQue = []
         for f in oldQue:
-            if f != figManager:
+            if f != manager:
                 Gcf._activeQue.append(f)
 
         del Gcf.figs[num]
         #print len(Gcf.figs.keys()), len(Gcf._activeQue)
-        figManager.destroy()
+        manager.destroy()
         gc.collect()
 
     @staticmethod
+    def destroy_fig(fig):
+        "*fig* is a Figure instance"
+        for manager in Gcf.figs.values():
+            if manager.canvas.figure == fig:
+                Gcf.destroy(manager.num)
+
+    @staticmethod
+    def destroy_all():
+        for manager in Gcf.figs.values():
+            Gcf.destroy(manager.num)
+
+
+    @staticmethod
     def has_fignum(num):
         """
         Return *True* if figure *num* exists.
@@ -105,3 +123,7 @@
         Gcf._activeQue.append(manager)
         Gcf.figs[manager.num] = manager
 
+atexit.register(Gcf.destroy_all)
+
+
+

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py     2010-06-12 
23:40:19 UTC (rev 8423)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py     2010-06-13 
21:04:14 UTC (rev 8424)
@@ -551,7 +551,7 @@
         self.canvas.destroy()
         if self.toolbar:
             self.toolbar.destroy()
-        self.__dict__.clear()
+        self.__dict__.clear()   #Is this needed? Other backends don't have it.
 
         if Gcf.get_num_fig_managers()==0 and \
                not matplotlib.is_interactive() and \

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_tkagg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_tkagg.py   2010-06-12 
23:40:19 UTC (rev 8423)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_tkagg.py   2010-06-13 
21:04:14 UTC (rev 8424)
@@ -491,10 +491,8 @@
         if self.window is not None:
             #self.toolbar.destroy()
             self.window.destroy()
+            self.window = None
 
-            pass
-        self.window = None
-
     def set_window_title(self, title):
         self.window.wm_title(title)
 

Modified: trunk/matplotlib/lib/matplotlib/pyplot.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/pyplot.py   2010-06-12 23:40:19 UTC (rev 
8423)
+++ trunk/matplotlib/lib/matplotlib/pyplot.py   2010-06-13 21:04:14 UTC (rev 
8424)
@@ -315,21 +315,15 @@
         figManager = _pylab_helpers.Gcf.get_active()
         if figManager is None: return
         else:
-            figManager.canvas.mpl_disconnect(figManager._cidgcf)
             _pylab_helpers.Gcf.destroy(figManager.num)
     elif len(args)==1:
         arg = args[0]
         if arg=='all':
-            for manager in _pylab_helpers.Gcf.get_all_fig_managers():
-                manager.canvas.mpl_disconnect(manager._cidgcf)
-                _pylab_helpers.Gcf.destroy(manager.num)
+            _pylab_helpers.Gcf.destroy_all()
         elif isinstance(arg, int):
             _pylab_helpers.Gcf.destroy(arg)
         elif isinstance(arg, Figure):
-            for manager in _pylab_helpers.Gcf.get_all_fig_managers():
-                if manager.canvas.figure==arg:
-                    manager.canvas.mpl_disconnect(manager._cidgcf)
-                    _pylab_helpers.Gcf.destroy(manager.num)
+            _pylab_helpers.Gcf.destroy_fig(arg)
         else:
             raise TypeError('Unrecognized argument type %s to close'%type(arg))
     else:


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to