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 <efir...@hawaii.edu> wrote: > From: Eric Firing <efir...@hawaii.edu> > Subject: Re: [matplotlib-devel] repeated calls to show() are now OK? > To: "Michiel de Hoon" <mjldeh...@yahoo.com> > Cc: "John Hunter" <jdh2...@gmail.com>, "matplotlib development list" > <matplotlib-devel@lists.sourceforge.net> > 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<efir...@hawaii.edu> > 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. > > > ------------------------------------------------------------------------------ ThinkGeek and WIRED's GeekDad team up for the Ultimate GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the lucky parental unit. See the prize list and enter to win: http://p.sf.net/sfu/thinkgeek-promo _______________________________________________ Matplotlib-devel mailing list Matplotlib-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-devel