D'oh, googled myself a solution just after I sent this message. handler_block_by_func() allows me to suppress the extraneous invocations of the signal handler while I'm making calls to set_value(), and then I call handler_unblock_by_func() when I'm done. You can see the solution here:
https://github.com/robru/GottenGeography/blob/3e50bc2e2d11fa969d14564336fc170906b19ef9/gottengeography.py#L673 On Fri, Nov 12, 2010 at 7:13 PM, Robert Park <[email protected]> wrote: > Hi guys. > > TL;DR: is there a way to suppress the value-changed signal from being > emitted when I call SpinButton.set_value()? > > My application needs to be able to let the user specify a length of > time, which I've chosen the SpinButton to represent (I like that it > accepts mouse wheel as input as well as typing and up/down buttons). > > The way I'm doing this currently is with three separate SpinButtons, > one for hours, one for minutes, and one for seconds. When I need the > total time duration, I call get_value() on each of them, multiplying > hours by 3600 and minutes by 60, and summing the results, giving me a > total number of seconds representing a time duration. This works out > really well for me because my app uses epoch seconds for all internal > date logic. > > The problem that I'm running into, however, is that I want the > SpinButtons to be able to overflow smoothly (eg, if hours says 0 and > minutes says 59 and seconds says 59 and the user clicks on the up > arrow of the seconds SpinButton, I want the spinbuttons to then read > as 1 hour, 0 minutes, 0 seconds. > > I wrote some rudimentary code in my value-changed signal handler to > change these values, but I'm running into issues where calling > set_value() on a SpinButton causes it to re-emit the value-changed > signal, which in turn re-invokes my value-changed signal handler. In > the worst case, my signal handler is called 5 times for a single user > event (once for the user event, once to set the seconds spinbutton to > 0, once again to change the minutes spinbutton from 59 to 60, once > again to set it from 60 to 0, and once again to set the hours from 0 > to 1). > > This turns into a pretty big disaster of race conditions and painful > logic where five instances of the method are running simultaneously. > Somehow, by some fluke of luck, the code I've written seems to work, > but I have no idea how or why. You can see it here: > > https://github.com/robru/GottenGeography/blob/master/gottengeography.py#L673 > > I'm terrified that this delicate balance of race conditions is going > to blow up on some other computer that's perhaps not as fast as my > development machine. > > Is there any way at all that I can suppress the value-changed signal > from being emitted while I'm setting the value of a SpinButton, that > would be a HUGE help to me. Failing that, however, is there some way > that I can program a single SpinButton to represent time in the form > of "HH:MM:SS"? (as opposed to three separate SpinButtons each > displaying an int). Ideally the SpinButton would handle the overflow > of seconds and minutes by itself, and get_value() would just give me > the total time in seconds. > > Thanks! > > -- > http://exolucere.ca > -- http://exolucere.ca _______________________________________________ pygtk mailing list [email protected] http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://faq.pygtk.org/
