Re: [matplotlib-devel] repeated calls to show() are now OK?

2010-06-12 Thread Michiel de Hoon
> I agree that the difference in blocking behavior is still a
> problem. I think that what we should do for now, *if* multiple
> calls to show work on the Mac (which I can't easily test), is
> change the documentation to correspond to the present situation,
> highlighting the real problem of different blocking behavior.

On Mac OS X, the MacOSX native backend supports multiple calls to show(). Each 
call to show() blocks, and show() returns when all figures are closed by the 
user.

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.

With GtkCairo on Mac OS X, each call to show() blocks, so show() can be called 
repeatedly. However, after closing all windows, show() does not return unless 
the user presses ctrl-c. This may not be so difficult to fix though. Basically, 
we need to keep track of how many windows are open at any given point, and tell 
the GTK main loop to exit when the number of windows reaches zero (this is how 
the MacOSX native backend does it).

--Michiel.


  

--
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


Re: [matplotlib-devel] repeated calls to show() are now OK?

2010-06-12 Thread Eric Firing
On 06/11/2010 10:02 PM, Michiel de Hoon wrote:
>> I agree that the difference in blocking behavior is still a
>> problem. I think that what we should do for now, *if* multiple
>> calls to show work on the Mac (which I can't easily test), is
>> change the documentation to correspond to the present situation,
>> highlighting the real problem of different blocking behavior.
>
> On Mac OS X, the MacOSX native backend supports multiple calls to show(). 
> Each call to show() blocks, and show() returns when all figures are closed by 
> the user.
>
OK, so this sounds like the standard blocking behavior, just like gtk*, 
wx*, and qt* on Linux.

> 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.

> With GtkCairo on Mac OS X, each call to show() blocks, so show() can be 
> called repeatedly. However, after closing all windows, show() does not return 
> unless the user presses ctrl-c. This may not be so difficult to fix though. 
> Basically, we need to keep track of how many windows are open at any given 
> point, and tell the GTK main loop to exit when the number of windows reaches 
> zero (this is how the MacOSX native backend does it).
>

I wasn't even aware of this backend; but sure enough, I have it on 
linux, and it works the same as gtkagg et al.

Why would it behave differently on OS X, with the need for the ctrl-C?

If you have TkAgg and GtkCairo, does it mean you also have GtkAgg?  If 
so, I would expect it to behave like GtkCairo.

Thanks for the testing.

Eric


> --Michiel.
>
>
>


--
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


Re: [matplotlib-devel] repeated calls to show() are now OK?

2010-06-12 Thread Michiel de Hoon
--- On Sat, 6/12/10, Eric Firing  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.


  

--
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


Re: [matplotlib-devel] repeated calls to show() are now OK?

2010-06-12 Thread Eric Firing
On 06/12/2010 05:37 AM, Michiel de Hoon wrote:
> --- On Sat, 6/12/10, Eric Firing  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


Re: [matplotlib-devel] repeated calls to show() are now OK?

2010-06-12 Thread Michiel de Hoon
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  wrote:

> From: Eric Firing 
> Subject: Re: [matplotlib-devel] repeated calls to show() are now OK?
> To: "Michiel de Hoon" 
> Cc: "John Hunter" , "matplotlib development list" 
> 
> 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 
> 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