On 06/12/2010 08:12 PM, Michiel de Hoon wrote: > 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. >
Except that with block=False there is that _needmain flag. And as you noted earlier, it blocks the first time, but not after that. Somehow, I had previously missed the fact that it did block on the first call, so I did not realize that the tkagg behavior was identical on linux and mac, as one would expect. Eric > --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