Hello all,<br><br>As many of you know, we have been working hard on IPython 0.11.  One of the big new features of 0.11 is a refactored integration with GUI event loops.<br>We are very excited about this as it is much more stable and add new capabilities, like being able to enable pylab *after* starting IPython (it is a magic: %pylab).<br>
<br>BUT, as Fernando and I have started to use the IPython 0.11 alpha for our daily work, we have found some subtle issue with IPython 0.11 and the current<br>versions of matplotlib and Enthought tool suite (traits, chaco, mayavi).  All of these packages rely on IPython&#39;s previous way of handling GUI <br>
integration.  Because of this, current versions of matplotlib and ets don&#39;t work fully with IPython 0.11.  In some cases, they work OK, but there are a whole class<br>of bugs that keep popping up.  We don&#39;t want to release IPython 0.11 until these issues are resolved.<br>
<br>All of these bugs are related to a few aspects of creating the main GUI app objects and starting event loops.  We think we understand the issues, but we will<br>need to work with the devs of matplotlib and ets to decide on how we all want to handle these things.  Here is where we are at...<br>
<br>Current situation<br>
=============<br>
<br>
Both matplotlib and ets have code that tries to:<br>
<br>
* See what GUI toolkit is being used<br>
* Get the global App object if it already exists, if not create it.<br>
* See if the main loop is running, if not possibly start it.<br>
<br>
All of this logic makes many assumptions about how IPython affects the answers to these<br>
questions.  Because IPython&#39;s GUI support has changed in significant ways, current matplotlib<br>
and ets make incorrect decisions about these issues (such as trying to start the event loop<br>
a second time, creating a second main App ojbect, etc.) under IPython 0.11.  This leads to crashes...<br><br>Description of GUI support in 0.11<br>==========================<br><br>IPython allows GUI event loops to be run in an interactive IPython session.<br>
This is done using Python&#39;s PyOS_InputHook hook which Python calls<br>when the :func:`raw_input` function is called and is waiting for user input.<br>IPython has versions of this hook for wx, pyqt4 and pygtk.  When the inputhook<br>
is called, it iterates the GUI event loop until a user starts to type again.  When<br>the user stops typing, the event loop iterates again.  This is how tk works.<br><br>When a GUI program is used interactively within IPython, the event loop of<br>
the GUI should *not* be started. This is because, the PyOS_Inputhook itself<br>is responsible for iterating the GUI event loop.<br><br>IPython has facilities for installing the needed input hook for each GUI <br>toolkit and for creating the needed main GUI application object. Usually,<br>
these main application objects should be created only once and for some<br>GUI toolkits, special options have to be passed to the application object<br>to enable it to function properly in IPython.<br><br>What we need to decide<br>
===================<br><br>We need to answer the following questions:<br><br>* Who is responsible for creating the main GUI application object, IPython<br>  or third parties (matplotlib, enthought.traits, etc.)?<br><br>* What is the proper way for third party code to detect if a GUI application<br>
  object has already been created?  If one has been created, how should<br>  the existing instance be retrieved?<br><br>* In a GUI application object has been created, how should third party code<br>  detect if the GUI event loop is running. It is not sufficient to call the<br>
  relevant function methods in the GUI toolkits (like ``IsMainLoopRunning``)<br>  because those don&#39;t know if the GUI event loop is running through the<br>  input hook.<br><br>* We might need a way for third party code to determine if it is running<br>
  in IPython or not.  Currently, the only way of running GUI code in IPython<br>  is by using the input hook, but eventually, GUI based versions of IPython<br>  will allow the GUI event loop in the more traditional manner. We will need<br>
  a way for third party code to distinguish between these two cases.<br><br>Thanks for participating in this discussion!<br><br>Cheers,<br><br>Brian<br><br>