I have implemented a prototype of interactive backend detection. As I
proposed earlier, I added an extra rc parameter 'backend_fallback' that
allows pyplot to inspect sys.modules on load and try to redirect
interactive backends to the appropriate ones.

I am attaching a patch, not for inclusion, as I still want to check
different details on interactivity, and the behavior of the show command,
but for comments and triage. I have tested it in various apps, and I
think it is interesting to review the different mainstream apps
presenting a interactive shell in which pylab can be used interactively.

* wx apps. In mayavi2, my near-born ipython frontend the attached patch 
 works seamlessly, with or without the interactive switch. In SPE 
 (wx-based IDE) it does not work, and I suspect this is because of ugly 
 things SPE does to the wx image-loading, for theming reasons, as I see
 totally unrelated errors. 

* Qt: In Eric4 the qt detection does not work as it seems that Eric 
  spawns a new python process. As a result, as long as you keep the 
  interactive switch off, pylab works great, but you really have to use a 
  blocking show. Does anybody now a Qt program that has an interactive
  Python prompt?

* In IDLE I can't figure out what is happening. I must confess that I do not 
  know much about Tkinter, and I am not too sure how matplotlib is
  supposed to collaborate with an existing Tk mainloop.

* The only GTK program I could think of with an interactive python prompt
  was accerciser, an pylab now works out of the box there, in interactive
  mode or not.

Of course in ipython -q|q4|w|g-thread, my addition work seamlessly, but
that was too easy :).

Some remarks that came out of this extensive testing:

  - show starts a mainloop and is blocking even if there are not windows
    open. This basically leads to a deadlock where the user cannot
    interrupt the mainloop. This can probably be easily fixed, and I'll
    look into it.

  - we cannot guess whether the user want to be in interactive mode or
    not: there is a potential large cost of being in interactive mode due to 
    continuous refreshing of the UI. Ipython gets it right by turning the
    interactive mode off when running a script, but when need the host
    environment to make this decision and we cannot make it in matplotlib.
    However, I believe it is important to expose more this
    functionality, as the user will now probably have to make this
    decision. This is why I have add the import of "interactive" in
    pyplot.

  - this brings up the fact that the user experience can be increased a
    lot if the host environment collaborates with matplotlib. This is why
    we discussed with John the idea of adding a "vendor registry", a
    light-weight module that an environment could import at little cost
    to tell matplotlib what backend to use, whether to put the
    interactive switch, and hopefully more, like maybe a factory to
    create new figure, as this would allow embedding these figures in an IDE.
    We do this with mayavi2, where the figures created by mlab are
    standalone windows when the fullblown environment is not running, but
    integrated windows when it is running.

I am sure there is more that we can learn. Please come up with ideas so
that we can see better what is the way forward for integrating matplotlib
to graphical shells and environments.

Cheers,

Gaƫl
Index: trunk/matplotlib/lib/matplotlib/pyplot.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/pyplot.py   (revision 5785)
+++ trunk/matplotlib/lib/matplotlib/pyplot.py   (working copy)
@@ -32,7 +32,22 @@
            MaxNLocator
 
 
+## Backend detection ##
+# If the wx Mainloop is started, starting another mainloop will crash
+# python, so we need to change to wx backend 
+import sys
+if 'wx' in sys.modules:
+    import wx
+    if wx.App.IsMainLoopRunning():
+        from matplotlib import rcParams, use
+        if rcParams['backend'].endswith('Agg'):
+            use('wxAgg')
+        else:
+            use('wx')
 
+
+
+
 ## Global ##
 
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to