|
From: Michiel de H. <mjl...@ya...> - 2010-06-13 06:12:57
|
So on Linux, show(block=True) blocks but show(block=False) doesn't? If matplotlib is in interactive mode, does show(block=True) still block? Because if matplotlib is in interactive mode, then the call to matplotlib.interactive(True) shouldn't make a difference, and I would expect show(block=True) and show(block=False) to behave the same way.
--Michiel.
--- On Sat, 6/12/10, Eric Firing <ef...@ha...> wrote:
> From: Eric Firing <ef...@ha...>
> Subject: Re: [matplotlib-devel] repeated calls to show() are now OK?
> To: "Michiel de Hoon" <mjl...@ya...>
> Cc: "John Hunter" <jd...@gm...>, "matplotlib development list" <mat...@li...>
> Date: Saturday, June 12, 2010, 11:32 PM
> On 06/12/2010 05:37 AM, Michiel de
> Hoon wrote:
> > --- On Sat, 6/12/10, Eric Firing<ef...@ha...>
> wrote:
> >>> With TkAgg on Mac OS X, the first call to
> show()
> >>> blocks, and returns when all figures are
> closed by the user.
> >>> However, subsequent calls to show() return
> immediately.
> >>
> >> This is anomalous, then; on linux, no call to show
> blocks
> >> with tkagg.
> >> Puzzling difference.
> >
> > If I remove the _needmain stuff in the show() function
> in the TkAgg backend, then each call to show() blocks on Mac
> OS X with the TkAgg backend, which (in my understanding) is
> the desired behavior. I don't know the purpose of _needmain
> in the show() function, other than to disallow multiple
> calls to show().
> >
> > --Michiel.
> >
>
> I committed a change to backend_tkagg that leaves the show
> functionality exactly as it is at present, but that
> facilitates testing of a simpler version that I think is
> more consistent with the other backends and with what we
> want. (I have appended the whole function to this
> message--see below for additional explanation.)
>
> I have also done some more exploration and testing, and
> here are my tentative conclusions:
>
> 1) We should aim for a show() that blocks until all windows
> are closed, on all backends, and in all environments.
> I think this is clearly something that many users would
> like; it has reasonable use cases; and it is simple,
> consistent, and easy to explain.
>
> 2) The big problem is the "in all environments" part of
> that statement. We probably can't achieve the goal,
> but I suspect that over the long term we can approach it,
> and the result will be "good enough".
>
> 3) As a step in that direction, I would like to see enough
> testing of Tk with show(block=True) so that, if it works, we
> can transition towards that behavior as the default,
> deprecate the old behavior, and eventually eliminate
> it. Presently, TkAgg is most anomalous among the major
> backends.
>
> 4) Leaving the documentation (all in the FAQ) with its
> caution against anything but a single show() at the end of a
> script is fine for 1.0; supporting multiple calls to a
> blocking show under mildly restrictive conditions is a
> reasonable goal for a subsequent release.
>
> Eric
>
> ------------------------------------------------
> def show(block=False):
> """
> Show all figures.
>
> Temporary, experimental kwarg *block*
> defaults to False to
> provide the behavior present throughout mpl
> history to date:
> interactive mode is forced on, and show does
> not block.
>
> Set *block* to True to test the proposed new
> behavior,
> consistent with other backends, in which show
> does not affect
> interactive mode, and always blocks until all
> figures are closed.
> In addition, the rcParam['tk.pythoninspect']
> is ignored.
>
> Use this kwarg only for testing; other
> backends do not accept
> a kwarg to show, and might never do so.
> """
> for manager in Gcf.get_all_fig_managers():
> manager.show()
> if block:
> # proposed new behavior; seems
> to make this backend consistent
> # with others, with no
> drawbacks identified yet.
> Tk.mainloop()
> else:
> # long-time behavior:
> non-blocking, forces interactive mode
> import matplotlib
> matplotlib.interactive(True)
> if
> rcParams['tk.pythoninspect']:
>
> os.environ['PYTHONINSPECT'] = '1'
> if show._needmain:
> Tk.mainloop()
> show._needmain =
> False
>
> show._needmain = True # This can go away
> if we eliminate block=False option.
>
>
>
|