Skip to content

Commit 8284684

Browse files
committed
ENH: implement ability to close just one figure
1 parent d304726 commit 8284684

File tree

2 files changed

+43
-10
lines changed

2 files changed

+43
-10
lines changed

mpl_gui/__init__.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -232,20 +232,27 @@ def close_all(self):
232232
passing it to `show`.
233233
234234
"""
235-
for fig in self.figures:
236-
if fig.canvas.manager is not None:
237-
fig.canvas.manager.destroy()
235+
for fig in list(self.figures):
236+
self.close(fig)
237+
238+
def close(self, val):
239+
if val == "all":
240+
return self.close_all()
241+
# or do we want to close _all_ of the figures with a given label / number?
242+
if isinstance(val, str):
243+
fig = self.by_label[val]
244+
elif isinstance(val, int):
245+
fig = self.by_number[val]
246+
else:
247+
fig = val
248+
if fig.canvas.manager is not None:
249+
fig.canvas.manager.destroy()
238250
# disconnect figure from canvas
239251
fig.canvas.figure = None
240252
# disconnect canvas from figure
241253
_FigureCanvasBase(figure=fig)
242-
self.figures.clear()
243-
244-
def close(self, val):
245-
if val != "all":
246-
# TODO close figures 1 at a time
247-
raise RuntimeError("can only close them all")
248-
self.close_all()
254+
if fig in self.figures:
255+
self.figures.remove(fig)
249256

250257

251258
class FigureContext(FigureRegistry):

mpl_gui/tests/test_examples.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,29 @@ def test_change_labels():
140140
for j, f in enumerate(fr.by_label.values()):
141141
f.set_label(f"aardvark {j}")
142142
assert list(fr.by_label) == [f"aardvark {j}" for j in range(5)]
143+
144+
145+
def test_close_one_at_a_time():
146+
fr = mg.FigureRegistry(block=False)
147+
fig1 = fr.figure(label='a')
148+
fig2 = fr.figure(label='b')
149+
fig3 = fr.figure(label='c')
150+
fr.figure(label='d')
151+
assert len(fr.figures) == 4
152+
153+
fr.close(fig1)
154+
assert len(fr.figures) == 3
155+
assert fig1 not in fr.figures
156+
157+
fr.close(fig2.get_label())
158+
assert len(fr.figures) == 2
159+
assert fig2 not in fr.figures
160+
161+
fr.show()
162+
163+
fr.close(fig3.canvas.manager.num)
164+
assert len(fr.figures) == 1
165+
assert fig3 not in fr.figures
166+
167+
fr.close('all')
168+
assert len(fr.figures) == 0

0 commit comments

Comments
 (0)