Re: [Matplotlib-users] Simple animation with Qt4 backend

2010-11-22 Thread Christopher Barker
On 11/21/10 9:43 AM, Gael Varoquaux wrote:

 Yes, I can confirm that adding processEvents in places to facilitate
 redraws is a good way to lead to segfaults. I have seen this in many
 places other than matplotlib. The reason Tk does not have this problem is
 that it deals with event loops in a fundementally different way that Wx
 or Qt.

wx has Yield() which sounds a lot like QT's processEvents. But it also 
has SafeYield() which can (in theory, anyway) be called safetly within 
an event handler.

Does QT have anything similar?

-Chris



-- 
Christopher Barker, Ph.D.
Oceanographer

Emergency Response Division
NOAA/NOS/ORR(206) 526-6959   voice
7600 Sand Point Way NE   (206) 526-6329   fax
Seattle, WA  98115   (206) 526-6317   main reception

chris.bar...@noaa.gov

--
Increase Visibility of Your 3D Game App  Earn a Chance To Win $500!
Tap into the largest installed PC base  get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


[Matplotlib-users] Simple animation with Qt4 backend

2010-11-21 Thread Pierre Raybaut
Hi all,

Following a discussion with a Spyder user regarding simple animations
with Matplotlib, I took a very quick look at the Qt4's backend source
code to see if it was possible to make the following code work (which
is working with the TkAgg backend but not the Qt4 backend):
http://www.scipy.org/Cookbook/Matplotlib/Animations#head-e50abcca4333d3d76b3f2bb66ef00f15c6b4dbbc

Apparently, to make it work with the Qt4 backend, one simply has to add:
QtGui.QApplication.processEvents()
to the method 'FigureCanvasQt.draw_idle' (matplotlib/backends/backend_qt4.py).

I did not look further to see if this QApplication.processEvents call
is affecting Matplotlib's performance in any way, but I guess that it
won't make a big difference.

Cheers,
Pierre

PS: I know that this example of animation is clearly not the most
efficient way to animate a Matplotlib figure (and that it's very ugly
from a GUI programming point of view!): the 'animation_blit_qt4.py'
example is probably the recommended way but the simple example above
is some much simpler for beginners.

--
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2  L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today
http://p.sf.net/sfu/msIE9-sfdev2dev
___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Re: [Matplotlib-users] Simple animation with Qt4 backend

2010-11-21 Thread Darren Dale
On Sun, Nov 21, 2010 at 10:36 AM, Pierre Raybaut
pierre.rayb...@gmail.com wrote:
 Hi all,

 Following a discussion with a Spyder user regarding simple animations
 with Matplotlib, I took a very quick look at the Qt4's backend source
 code to see if it was possible to make the following code work (which
 is working with the TkAgg backend but not the Qt4 backend):
 http://www.scipy.org/Cookbook/Matplotlib/Animations#head-e50abcca4333d3d76b3f2bb66ef00f15c6b4dbbc

 Apparently, to make it work with the Qt4 backend, one simply has to add:
 QtGui.QApplication.processEvents()
 to the method 'FigureCanvasQt.draw_idle' (matplotlib/backends/backend_qt4.py).

 I did not look further to see if this QApplication.processEvents call
 is affecting Matplotlib's performance in any way, but I guess that it
 won't make a big difference.

From 
http://www.mail-archive.com/matplotlib-de...@lists.sourceforge.net/msg05606.html
, discussion of why processEvents was originally removed from draw():

that line can not be added back in. When that line
is in place, the backend attempts to process queued events before it
is finished processing the current event. It was leading to segfaults
in some cases. processEvents should not be called in the middle of
processing an event.

I am not familiar with draw_idle, and the documentation isn't helpful.
Adding processEvents to that call looks similar to adding it to the
end of the draw method itself. I'll argue strongly against such a
change until it can be shown that the call to processEvents will never
occur while processing a current event (I don't want to reintroduce
segfaults in the programs I use at work.)

Darren

--
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2  L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today
http://p.sf.net/sfu/msIE9-sfdev2dev
___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Re: [Matplotlib-users] Simple animation with Qt4 backend

2010-11-21 Thread Gael Varoquaux
On Sun, Nov 21, 2010 at 11:58:42AM -0500, Darren Dale wrote:
  Apparently, to make it work with the Qt4 backend, one simply has to add:
  QtGui.QApplication.processEvents()
  to the method 'FigureCanvasQt.draw_idle' 
  (matplotlib/backends/backend_qt4.py).

 , discussion of why processEvents was originally removed from draw():

 that line can not be added back in. When that line
 is in place, the backend attempts to process queued events before it
 is finished processing the current event. It was leading to segfaults
 in some cases. processEvents should not be called in the middle of
 processing an event.

Yes, I can confirm that adding processEvents in places to facilitate
redraws is a good way to lead to segfaults. I have seen this in many
places other than matplotlib. The reason Tk does not have this problem is
that it deals with event loops in a fundementally different way that Wx
or Qt. I am not sure what the difference is exactly, but I seem to
remember that the Tk event loop is more or less hard-wired in Python, and
(maybe ?) lives in a different C-level thread.

The problem with animations in the example linked by Pierre is that there
is no redraw triggered, because the redraw needs to be done in the event
loop. The question that needs to be answered to make it easier for people
doing animations outside of the mainloop is rather: is there a way to
force a redraw without returning in the mainloop. Chances are that there
isn't, because the toolkit (Qt) is not thread safe.

But the problem really boils down to the fact that the example is not the
right way to write animations in GUI programming. However people do not
want to learn event loop programming (I can understand them) and want to
write for loops. In Mayavi, we provide a helper function that enables to
put such a for loop in a generator and pass the generator to the event
loop framework without having to worry about timer:
http://code.enthought.com/projects/mayavi/docs/development/html/mayavi/auto/mlab_other_functions.html#animate
While this function should work out of the box in Spyder, if the
ETS_TOOLKIT variable is well set for Mayavi/Traits to use the Qt backend,
it would also be fairly easy to port the main idea out of Mayavi and
Traits, in matplotlib or spyder:
https://svn.enthought.com/enthought/browser/Mayavi/trunk/enthought/mayavi/tools/animator.py

My 2 cents,

Gaƫl

--
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2  L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today
http://p.sf.net/sfu/msIE9-sfdev2dev
___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users