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

Reply via email to