Suppose that I have a gtk.Label (or any other gtk.Widget) label which has a method I don't like, for instance size_request. So I write a new method my_beautiful_size_request which behaves as I want.
However this won't work:
label.size_request = my_beautiful_size_request
; my method will just never be called, because apparently the C code which is under pygtk doesn't really care if the python object has a new method appended to it. This instead will work:
class MyLabel(gtk.Label): __gtype_name__ = 'MyLabel' do_size_request = my_beautiful_size_request label = MyLabel()
; this works for (as far as I know) all pygtk methods: it is sufficient to add do_ in front of the name of a method. Notice, however, that the do_* method doesn't necessarily accept the same arguments as the original, neither return the same values (and also notice that as of January 2009, there is a bug which makes error messages totally misleading). For instance, in our case, while size_request is called by just giving the instance as argument, and returns a tuple, do_size_request is called with two arguments: the instance and a requisition, and instead of returning the two dimensions, it sets them as requisition.width and requisition.height