Here's an excerpt from a module of miscellaneous pygtk functions.
It shows three platform-dependent implementations of an update()
function. update() is used e.g. to update a progress bar
in the middle of a time-consuming operation -- it's analogous to
the Tkinter update() function.
I haven't bothered looking at Gtk+ or pygtk sources in order to figure
out why you need threads_(enter|leave) on Solaris but not on Linux.
If somebody could explain the difference I'd be grateful.
One last note: This code was tested w. pygtk 0.6.2, on all
three platforms.
--
Mitch
[EMAIL PROTECTED]
-snip--snip--snip--snip--snip--snip--snip--snip--snip--snip--snip--snip-
# On IRIX we're running Gtk+ version 1.2.3. On Solaris and Linux we're
# running 1.2.6.
# On Linux, when performing a "manual" event loop to update the display,
# you gotta be careful to release the Gtk+ mutex by calling
# threads_(enter|leave). If you don't, the app will lock up when it
# checks for pending events.
# On IRIX, you can't call threads_enter, because we're using an old
# version of pygtk which doesn't expose the threads_(enter|leave)
# calls.
# On Solaris, you can't call threads_(enter|leave) because if you do
# the app will lock up when it checks for pending events.
#
# This all seems pretty bogus. But the following code works...
if sys.platform[:5] == "linux":
def update():
"""Update the UI: flush pending rqsts and process pending events."""
gtk.gdk_flush()
gtk.threads_leave()
while gtk.events_pending():
gtk.mainiteration(0)
gtk.threads_enter()
elif sys.platform[:5] == "sunos":
def update():
"""Update the UI: flush pending rqsts and process pending events."""
gtk.gdk_flush()
while gtk.events_pending():
gtk.mainiteration(0)
else:
# For IRIX w. Gtk+ 1.2.3:
def update():
"""Update the UI: flush pending rqsts and process pending events."""
# This solution was recommended on the pygtk mailing list,
# by Bernhard Herzog <[EMAIL PROTECTED]>, the author of Sketch.
# Speculation is that this is all due to a bug in recent versions
# of Gtk+, e.g. 1.2.3 - 1.2.6.
if hasattr(gtk, "gdk_flush"):
gtk.gdk_flush()
if hasattr(gtk, "threads_leave"):
gtk.threads_leave()
while gtk.events_pending():
gtk.mainiteration(0)
if hasattr(gtk, "threads_enter"):
gtk.threads_enter()
-snip--snip--snip--snip--snip--snip--snip--snip--snip--snip--snip--snip-
Mitch Chapman wrote:
>
> On Sat, 26 Feb 2000, Scott Bender wrote:
> > Actually, the hang came after my timeout function completed. It was calling
>mainiteration(FALSE) to
> > update a progress bar, which was causing the hang. Anyone know why?
> >
> > thanks,
> > - Scott
>
> I've seen this recently. The behavior varies depending on what version
> of Gtk+ you're running with, and on what operating system.
>
> The basic problem is that, on some platforms, even w. Gtk+ 1.2.6,
> you need to surround calls to gtk.events_pending() and
> gtk.mainiteration() with calls to gtk.threads_leave() and
> gtk.threads_enter(). On others (e.g. Solaris) you *shouldn't* do so.
To unsubscribe: echo "unsubscribe" | mail [EMAIL PROTECTED]