James Dietrich wrote:
[snip]
Hi,
Thanks for the suggestions, but it's not what I need.
Perhaps I didn't explain myself well enough.
In the original example, I want and expect that the spinbutton
should advance one digit at a time by clicking on the tiny
arrows.
It does work as expected if the adj_callback executes quickly,
like if I uncomment the return statement in there.
However, if that long loop executes in the callback (it takes
several seconds at least), then the spinbutton advances by
two digits for every one click.
Any more ideas on how to make the spinbutton only advance
one digit at a time even if the callback takes several seconds?
Thanks for your help,
James Dietrich
I think what might be happening is that the spinbutton arrow is thought
of as pressed until your callback finishes and GTK can go back to
handling events. Now, if spinbutton arrows are held down, they have a
repeat like the normal keyboard repeat. GTK registers the button as
being held down for a while and a repeat sneaks in there.
If this is the cause then you can fix it by moving the main work of your
handler to an idle callback, something like this:
def adj_callback(adj):
gobject.idle_add(_real_adj_callback)
def _real_adj_callback():
gtk.gdk.threads_enter()
try:
for x in range(10000000):
y = x * x
return False
finally:
gtk.gdk.threads_leave()
The threads enter/leave calls aren't needed if you're not using
threading, but for an action that can take several seconds you should
probably look at using them.
--
Tim Evans
Applied Research Associates NZ
http://www.aranz.co.nz/
_______________________________________________
pygtk mailing list pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/