diff --git a/IPython/zmq/pylab/backend_inline.py b/IPython/zmq/pylab/backend_inline.py index 91e86ff..a30b948 100644 --- a/IPython/zmq/pylab/backend_inline.py +++ b/IPython/zmq/pylab/backend_inline.py @@ -55,44 +55,67 @@ class InlineBackendConfig(SingletonConfigurable): # Functions #----------------------------------------------------------------------------- -def show(close=True): +def show(close=False): """Show all figures as SVG payloads sent to the IPython clients. Parameters ---------- close : bool, optional If true, a ``plt.close('all')`` call is automatically issued after - sending all the SVG figures. If this is set, the figures will entirely + sending all the figures. If this is set, the figures will entirely removed from the internal list of figures. """ for figure_manager in Gcf.get_all_fig_managers(): send_figure(figure_manager.canvas.figure) if close: matplotlib.pyplot.close('all') + show._to_draw = [] + # This flag will be reset by draw_if_interactive when called show._draw_called = False +# list of figures to draw when flush_figures is called +show._to_draw = [] def draw_if_interactive(): """ Is called after every pylab drawing command """ - # We simply flag we were called and otherwise do nothing. At the end of - # the code execution, a separate call to show_close() will act upon this. + # signal that the current active figure should be sent at the end of execution. + # Also sets the _draw_called flag, signaling that there will be something to send. + # At the end of the code execution, a separate call to flush_figures() + # will act upon these values + + fig = Gcf.get_active().canvas.figure + + # ensure current figure will be drawn, and each subsequent call + # of draw_if_interactive() moves the active figure to ensure it is + # drawn last + try: + show._to_draw.remove(fig) + except ValueError: + # ensure it only appears in the draw list once + pass + show._to_draw.append(fig) show._draw_called = True - def flush_figures(): - """Call show, close all open figures, sending all figure images. + """Send all figures that changed This is meant to be called automatically and will call show() if, during prior code execution, there had been any calls to draw_if_interactive. """ - if show._draw_called: - show() - show._draw_called = False + if not show._draw_called: + return + # exclude any figures that were closed: + active = set([fm.canvas.figure for fm in Gcf.get_all_fig_managers()]) + for fig in [ fig for fig in show._to_draw if fig in active ]: + send_figure(fig) + # clear flags for next round + show._to_draw = [] + show._draw_called = False def send_figure(fig):