[IPython-user] ipython -gthread behaviour is now to quit the script gtk.main() loop?

Gustavo Carneiro gjcarneiro@gmail....
Thu Feb 26 04:39:26 CST 2009


2009/2/26 Fernando Perez <fperez.net@gmail.com>

> Hi Gustavo,
>
> On Tue, Feb 24, 2009 at 6:50 AM, Gustavo Carneiro <gjcarneiro@gmail.com>
> wrote:
> > Hello, I have been having a problem since upgrading IPython.  I don't
> > remember exactly which version I had before, but now it's 0.8.4.
> >
> > Consider the following script:
> >
> > import gtk
> >
> > win = gtk.Window()
> > win.show()
> > bt = gtk.Button("Hello")
> > bt.show()
> > win.add(bt)
> >
> > print "begin"
> > gtk.main()
> > print "end"
> >
> >
> > In IPython 0.8.4, the gtk.main() call will immediately return and IPython
> > re-runs a new gtk.main(), possibly in a different thread.  In a previous
> > version (sorry, don't remember which) my own gtk.main() call would not
> exit,
> > it would just run the GUI.  I was sure that, when gtk.main() returned it
> was
> > because the window had been closed.
> >
> > Now I am unsure how to make it work again.  I have module function that
> is
> > supposed to "run the GUI and don't return until everything is finished".
> > Any advice on how to accomplish this without breaking the simple module
> API
> > that I provide?  Is there something like,
> > IPython.wait_until_gui_is_finished() ?
>
> Could you try running the attached script the way you used 'ipython
> -gthread' before?  This would help us understand the problem better,
> if this works the way you expect it.


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:

# My GUI code
import gtk
w = gtk.Window()
b = gtk.Button("Hello")
b.show()
w.add(b)
w.show()

# Run the gtk main loop, with IPython if possible
try:
    import IPython.Shell
except ImportError:
    gtk.main()
else:
    def hijack_gtk():
        """No-op version of the original mainloop hijacker
        """
        import gtk
        return gtk.main

    IPython.Shell.hijack_gtk = hijack_gtk

    ip = IPython.Shell.IPShellGTK()
    ip.mainloop()

This works perfectly.  It is not as "transparent" as before (you could run
ipython -gthread on a unmodified pygtk program), but it does the job nicely.

Maybe if the "hijacked gtk main loop" was the code below my comment "# Run
the gtk main loop, with IPython if possible", then things might be more
transparent for pygtk apps.  Because making a gtk.main() a lambda function
that just returns breaks the "blocking main loop" semantics, with possibly
disastrous results.

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. :-)

Anyway, thanks for your answer, it has been very useful.

[1] http://ipython.scipy.org/moin/Cookbook/EmbeddingInGTK

-- 
Gustavo J. A. M. Carneiro
INESC Porto, Telecommunications and Multimedia Unit
"The universe is always one step beyond logic." -- Frank Herbert
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ipython.scipy.org/pipermail/ipython-user/attachments/20090226/020263d0/attachment.html 


More information about the IPython-user mailing list