<br><br><div class="gmail_quote">2009/2/26 Fernando Perez <span dir="ltr">&lt;<a href="http://fperez.net">fperez.net</a>@<a href="http://gmail.com">gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi Gustavo,<br>
<div class="Ih2E3d"><br>
On Tue, Feb 24, 2009 at 6:50 AM, Gustavo Carneiro &lt;<a href="mailto:gjcarneiro@gmail.com">gjcarneiro@gmail.com</a>&gt; wrote:<br>
&gt; Hello, I have been having a problem since upgrading IPython.  I don&#39;t<br>
&gt; remember exactly which version I had before, but now it&#39;s 0.8.4.<br>
&gt;<br>
&gt; Consider the following script:<br>
&gt;<br>
&gt; import gtk<br>
&gt;<br>
&gt; win = gtk.Window()<br>
&gt; win.show()<br>
&gt; bt = gtk.Button(&quot;Hello&quot;)<br>
&gt; bt.show()<br>
&gt; win.add(bt)<br>
&gt;<br>
&gt; print &quot;begin&quot;<br>
&gt; gtk.main()<br>
&gt; print &quot;end&quot;<br>
&gt;<br>
&gt;<br>
&gt; In IPython 0.8.4, the gtk.main() call will immediately return and IPython<br>
&gt; re-runs a new gtk.main(), possibly in a different thread.  In a previous<br>
&gt; version (sorry, don&#39;t remember which) my own gtk.main() call would not exit,<br>
&gt; it would just run the GUI.  I was sure that, when gtk.main() returned it was<br>
&gt; because the window had been closed.<br>
&gt;<br>
&gt; Now I am unsure how to make it work again.  I have module function that is<br>
&gt; supposed to &quot;run the GUI and don&#39;t return until everything is finished&quot;.<br>
&gt; Any advice on how to accomplish this without breaking the simple module API<br>
&gt; that I provide?  Is there something like,<br>
&gt; IPython.wait_until_gui_is_finished() ?<br>
<br>
</div>Could you try running the attached script the way you used &#39;ipython<br>
-gthread&#39; before?  This would help us understand the problem better,<br>
if this works the way you expect it.</blockquote><div><br>Yeah, more or less.  I have to change slightly my strategy.  I cannot run the simulation with ipython -gthread; instead I just run with plain old python and import IPython module and run the main loop.  Taking your code I get this:<br>
<br></div></div><div style="margin-left: 40px;"><span style="font-family: courier new,monospace;"># My GUI code</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">import gtk</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">w = gtk.Window()</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">b = gtk.Button(&quot;Hello&quot;)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">b.show()</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">w.add(b)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">w.show()</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"># Run the gtk main loop, with IPython if possible</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">try:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    import IPython.Shell</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">except ImportError:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    gtk.main()</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">else:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    def hijack_gtk():</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">        &quot;&quot;&quot;No-op version of the original mainloop hijacker</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        &quot;&quot;&quot;    </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">        import gtk</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        return gtk.main</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    IPython.Shell.hijack_gtk = hijack_gtk</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    ip = IPython.Shell.IPShellGTK()</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    ip.mainloop()</span><br></div>
<br>This works perfectly.  It is not as &quot;transparent&quot; as before (you could run ipython -gthread on a unmodified pygtk program), but it does the job nicely.<br><br>Maybe if the &quot;hijacked gtk main loop&quot; was the code below my comment &quot;<span style="font-family: courier new,monospace;"># Run the gtk main loop, with IPython if possible&quot;</span>, then things might be more transparent for pygtk apps.  Because making a gtk.main() a lambda function that just returns breaks the &quot;blocking main loop&quot; semantics, with possibly disastrous results.<br clear="all">
<br>In any case, this provided the needed motivation for me to add a GUI console to my pygtk app, following the recipe at [1], which was painless and works great. :-)<br><br>Anyway, thanks for your answer, it has been very useful.<br>
<br>[1] <a href="http://ipython.scipy.org/moin/Cookbook/EmbeddingInGTK">http://ipython.scipy.org/moin/Cookbook/EmbeddingInGTK</a><br><br>-- <br>Gustavo J. A. M. Carneiro<br>INESC Porto, Telecommunications and Multimedia Unit<br>
&quot;The universe is always one step beyond logic.&quot; -- Frank Herbert<br>