Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4e5f69d

Browse files
committed
Handle FigureManager destroy internaly without pyplot.
1 parent 80adaaf commit 4e5f69d

File tree

4 files changed

+18
-12
lines changed

4 files changed

+18
-12
lines changed

lib/matplotlib/_pylab_helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def destroy(cls, num):
124124
cls._activeQue.append(f)
125125

126126
del cls.figs[num]
127-
manager.destroy()
127+
manager.destroy() # Unneeded with MEP27 remove later
128128
gc.collect(1)
129129

130130
@classmethod

lib/matplotlib/backend_bases.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2546,7 +2546,7 @@ def key_press_handler(event, canvas, toolbar=None):
25462546
if isinstance(canvas.manager, FigureManagerBase): # Using old figman.
25472547
Gcf.destroy_fig(canvas.figure)
25482548
else:
2549-
canvas.manager._destroy('window_destroy_event')
2549+
canvas.manager.destroy('window_destroy_event')
25502550

25512551
if toolbar is not None:
25522552
# home or reset mnemonic (default key 'h', 'home' and 'r')

lib/matplotlib/backend_managers.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def __init__(self, figure, num):
7878
self._backend = get_backend()
7979
self._mainloop = self._backend.MainLoop()
8080
self.window = self._backend.Window('Figure %d' % num)
81-
self.window.mpl_connect('window_destroy_event', self._destroy)
81+
self.window.mpl_connect('window_destroy_event', self.destroy)
8282

8383
self.canvas = self._backend.FigureCanvas(figure, manager=self)
8484

@@ -122,23 +122,29 @@ def key_press(self, event):
122122
"""
123123
key_press_handler(event, self.canvas, self.canvas.toolbar)
124124

125-
def _destroy(self, event=None):
126-
# Callback from the when the window wants to destroy itself
127-
s = 'window_destroy_event'
128-
event = FigureManagerEvent(s, self)
129-
self._callbacks.process(s, event)
130-
131125
def destroy(self, *args):
132-
"""Called to destroy this FigureManager, gets called by Gcf through
133-
event magic.
126+
"""Called to destroy this FigureManager.
134127
"""
128+
129+
# Make sure we run this routine only once for the FigureManager
130+
# This ensures the nasty __del__ fix below works.
131+
if getattr(self, '_destroying', False):
132+
return
133+
134+
self._destroying = True
135135
self.canvas.destroy()
136136
if self.toolbar:
137137
self.toolbar.destroy()
138138
self.window.destroy()
139139

140+
# Fix as for some reason we have extra references to this#
141+
# i.e. ``del self._mainloop`` doesn't work
140142
self._mainloop.__del__()
141143

144+
s = 'window_destroy_event'
145+
event = FigureManagerEvent(s, self)
146+
self._callbacks.process(s, event)
147+
142148
def show(self):
143149
"""Shows the figure"""
144150
self.window.show()

lib/matplotlib/backend_tools.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ def trigger(self, sender, event, data=None):
357357
except:
358358
pass
359359
else:
360-
manager._destroy('window_destroy_event')
360+
manager.destroy('window_destroy_event')
361361

362362

363363
class ToolQuitAll(ToolBase):

0 commit comments

Comments
 (0)