[pygtk] Callbacks
Peyman
paskari007 at yahoo.ca
Mon Jul 27 23:34:55 WST 2009
Hi, a while back I inquired about blocking signals, and we came to the
conclusion that via glade there is no way to get a hold of the handler
IDs, so we had to use handler_block_by_func(). At the time
handler_block_by_func() didn't even work for me under python. I have
switched over to C, and handler_block_by_func() finally works.
Unfortunately, handler_unblock_by_func() does not work. I don't know
if this is because it is corrupted, or b/c I am using it incorrectly.
Quite frankly, I'm starting to lose my patience since there is very
little help on the internet wrt blocking functions.
I also can't seem to find a way to autoconnect signals AND save their
handler IDs. This would seem like a very important option.
It's getting to the point where I might start using brute force, and
connecting every signal manually, but I hope someone informs me of an
easier approach
Thank You
Peyman Askari
On 11 Mar 2009, at 13:31, Walter Leibbrandt wrote:
> Hi,
>
> Maybe I should just let some code do the talking. See attached script.
>
> The button's "clicked" handler adds an "x" to the entry. The toggle
> button uses handler_(un)block_by_func() on addx_clicked so that it
> is only enabled if the toggle button is active. Note that
> handler_(un)block_by_func() was called on btn, seeing as that is the
> widget to which the handler is connected.
>
> This is quite an exciting discovery for myself too. Seeing as its in
> GObject and not in Glade, I can use this with my custom widgets too
> and need not keep signal dictionaries anymore! :)
>
> P.S. In this context "handler" means the function/method connected
> to a signal.
>
> Peyman wrote:
>> Hi Walter
>>
>> I am running into problems using it. To use
>> handler_bloc_by_func(callable) you have to pass callable: a
>> callable python object. I have tried using the widget itself, and
>> it's callback functions, but neither is working. What exactly do i
>> have to pass as a parameter. You made reference to passing the
>> "handler" to it.
>>
>> Cheers
>>
>>
>>
>> Peyman Askari
>>
>> On 11 Mar 2009, at 12:53, Walter Leibbrandt wrote:
>>
>>> Hi,
>>>
>>> It seems that this has been asked before: http://osdir.com/ml/gnome.gtk+.python/2003-04/msg00089.html
>>>
>>> Short answer: no, it doesn't seem like you can. I have, however,
>>> found the handler_block_by_func() and handler_unblock_by_func()
>>> methods of gobject.GObject. Although I haven't tested this yet, it
>>> seems from the docs (http://library.gnome.org/devel/pygobject/stable/class-gobject.html#method-gobject--handler-block-by-func
>>> ) that you can simply pass your handler to it to (un)block it from
>>> being called.
>>>
>>> Let me know how/if it works.
>>>
>>> HTH,
>>>
>>> Peyman wrote:
>>>> I realize that once you call connect() it returns the handle_id.
>>>> But if glade is doing this for me, are the handle id's stored
>>>> somewhere? Surely there has to be a
>>>> widget.get_handle_id('callback_function') method. I can't seem to
>>>> find anything on this over the net though.
>>>
>>> --
>>> Walter Leibbrandt http://translate.org.za/blogs/walter
>>> Software Developer +27 12 460
>>> 1095 (w)
>>> Translate.org.za
>>>
>>> Recent blogs:
>>> * Firefox-style button with a pop-up menu
>>> http://www.translate.org.za/blogs/walter/en/content/firefox-style-button-pop-menu
>>> * Virtaal's MVCisation
>>> * Things that changed the way I code
>>>
>>>
>>
>
> --
> Walter Leibbrandt http://translate.org.za/blogs/
> walter
> Software Developer +27 12 460 1095
> (w)
> Translate.org.za
>
> Recent blogs:
> * Firefox-style button with a pop-up menu
> http://www.translate.org.za/blogs/walter/en/content/firefox-style-button-pop-menu
> * Virtaal's MVCisation
> * Things that changed the way I code
>
>
> #!/usr/bin/env python
>
> import gtk
> import gtk.glade
>
> xml = gtk.glade.XML('gui.glade')
> win = xml.get_widget('window')
> btn = xml.get_widget('button')
> entry = xml.get_widget('entry')
>
> def addx_clicked(*args):
> entry.props.text += 'x'
>
> def enable_toggled(togglebtn):
> if togglebtn.get_active():
> btn.handler_unblock_by_func(addx_clicked)
> else:
> btn.handler_block_by_func(addx_clicked)
>
> win.connect('destroy', lambda *args: gtk.main_quit())
> btn.connect('clicked', addx_clicked)
> xml.get_widget('togglebutton').connect('toggled', enable_toggled)
>
> win.show_all()
> gtk.main()
> <gui.glade>
More information about the pygtk
mailing list