First cut on a QtAgg backend

All I really interested in is seeing the QtAgg front end in

    > matplotlib as a supported component (which we'd be happy to
    > help maintain) so whatever gets us there the quickest sounds
    > good to me.

    > I am in the same position as you; I just want a Qt-backend
    > for Matplotlib.

Well, actually it looks like Ted wants a front end and Sigve wants a
backend. Let's hope these differences are not irreconcilable!

<wink>
JDH

John,
I have someone fixing the last items (status bar and error handling) from the Qt backend and I had a few questions. You said:

  * If you try to save to an unsupported output type (eg pdf) the
    entire window closes -- a bit extreme

This seems to happen on the TkAgg backend as well. The culprit seems to be this code (backend_tkagg.py):

         try:
             self.canvas.print_figure(fname)
         except IOError, msg:
             err = '\n'.join(map(str, msg))
             msg = 'Failed to save %s: Error msg was\n\n%s' % (
                 fname, err)
             error_msg_tkpaint(msg)

The exception (at least for trying to save a pdf file) is not an IOError so the message get's propagated up and you exit the event loop (which is what causes the window to disappear).

I think the problem is that backend_agg.py is calling error_msg() that it COPYS from backend_bases.py. The default action from backend_bases.py is to print a message and call sys.exit() which is what is generating this message. I assume that somewhere you're trapping the exit call to send an exception?

On the surface (i.e. w/o knowing the design decisions that were made), this seems like a bad idea. It seems like exceptions should be used and that sys.exit() should exit the program. Changing the behavior of a standard call like sys.exit() (if that's what is really happening) seems like a bad idea since it changes global behavior.

Also, I'm a little confused about the backends use of the 'error_msg' function. Many of the backends import this function from backend_bases but then change that names definition to a local copy (see backend_gtk, backend_template, backend_wx). This seems wrong or at least more confusing that it needs to be. I don't think a script should explicitly import something with one name and then change the name to point to a local variable.

Is the idea that the backends should overload the error_msg function that all the code uses? If that's the case it would be a simple change to do something like this:

import backend_bases
backend_bases.error_msg = error_msg_tkpaint

Ted
Ted Drain Jet Propulsion Laboratory ted.drain@...179...