Skip to content

Commit 66c3d4a

Browse files
authored
Merge pull request #16819 from anntzer/destroymanager
Destroy figures by manager instance, not by number.
2 parents bb7f9b9 + 9e6f112 commit 66c3d4a

File tree

8 files changed

+22
-16
lines changed

8 files changed

+22
-16
lines changed

lib/matplotlib/_pylab_helpers.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,23 @@ def get_fig_manager(cls, num):
4545
@classmethod
4646
def destroy(cls, num):
4747
"""
48-
Destroy figure number *num*.
48+
Destroy manager *num* -- either a manager instance or a manager number.
4949
5050
In the interactive backends, this is bound to the window "destroy" and
5151
"delete" events.
52+
53+
It is recommended to pass a manager instance, to avoid confusion when
54+
two managers share the same number.
5255
"""
53-
if not cls.has_fignum(num):
54-
return
55-
manager = cls.figs.pop(num)
56+
if all(hasattr(num, attr) for attr in ["num", "_cidgcf", "destroy"]):
57+
manager = num
58+
if cls.figs.get(manager.num) is manager:
59+
cls.figs.pop(manager.num)
60+
else:
61+
try:
62+
manager = cls.figs.pop(num)
63+
except KeyError:
64+
return
5665
manager.canvas.mpl_disconnect(manager._cidgcf)
5766
manager.destroy()
5867
gc.collect(1)
@@ -62,8 +71,7 @@ def destroy_fig(cls, fig):
6271
"""Destroy figure *fig*."""
6372
canvas = getattr(fig, "canvas", None)
6473
manager = getattr(canvas, "manager", None)
65-
num = getattr(manager, "num", None)
66-
cls.destroy(num)
74+
cls.destroy(manager)
6775

6876
@classmethod
6977
def destroy_all(cls):

lib/matplotlib/backends/_backend_tk.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ def show(self):
456456
if not self._shown:
457457
def destroy(*args):
458458
self.window = None
459-
Gcf.destroy(self.num)
459+
Gcf.destroy(self)
460460
self.canvas._tkcanvas.bind("<Destroy>", destroy)
461461
self.window.deiconify()
462462
else:

lib/matplotlib/backends/backend_gtk3.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -367,10 +367,8 @@ def add_widget(child):
367367

368368
self.window.set_default_size(w, h)
369369

370-
def destroy(*args):
371-
Gcf.destroy(num)
372-
self.window.connect("destroy", destroy)
373-
self.window.connect("delete_event", destroy)
370+
self.window.connect("destroy", lambda *args: Gcf.destroy(self))
371+
self.window.connect("delete_event", lambda *args: Gcf.destroy(self))
374372
if mpl.is_interactive():
375373
self.window.show()
376374
self.canvas.draw_idle()

lib/matplotlib/backends/backend_macosx.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def __init__(self, canvas, num):
106106
self.canvas.draw_idle()
107107

108108
def close(self):
109-
Gcf.destroy(self.num)
109+
Gcf.destroy(self)
110110

111111

112112
class NavigationToolbar2Mac(_macosx.NavigationToolbar2, NavigationToolbar2):

lib/matplotlib/backends/backend_nbagg.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ def new_figure_manager_given_figure(num, figure):
231231
if is_interactive():
232232
manager.show()
233233
figure.canvas.draw_idle()
234-
canvas.mpl_connect('close_event', lambda event: Gcf.destroy(num))
234+
canvas.mpl_connect('close_event', lambda event: Gcf.destroy(manager))
235235
return manager
236236

237237
@staticmethod

lib/matplotlib/backends/backend_qt5.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ def _widgetclosed(self):
590590
return
591591
self.window._destroying = True
592592
try:
593-
Gcf.destroy(self.num)
593+
Gcf.destroy(self)
594594
except AttributeError:
595595
pass
596596
# It seems that when the python session is killed,

lib/matplotlib/backends/backend_wx.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1007,7 +1007,7 @@ def _onClose(self, event):
10071007
_log.debug("%s - onClose()", type(self))
10081008
self.canvas.close_event()
10091009
self.canvas.stop_event_loop()
1010-
Gcf.destroy(self.num)
1010+
Gcf.destroy(self)
10111011
# self.Destroy()
10121012

10131013
def GetToolBar(self):

lib/matplotlib/pyplot.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ def close(fig=None):
690690
if figManager is None:
691691
return
692692
else:
693-
_pylab_helpers.Gcf.destroy(figManager.num)
693+
_pylab_helpers.Gcf.destroy(figManager)
694694
elif fig == 'all':
695695
_pylab_helpers.Gcf.destroy_all()
696696
elif isinstance(fig, int):

0 commit comments

Comments
 (0)