[PyKDE] "sender" info in Python slot
shlomme at gmx.net
Thu Nov 9 20:54:23 GMT 2006
-----BEGIN PGP SIGNED MESSAGE-----
Jeremy Sanders schrieb:
> On Thu, 9 Nov 2006, Andreas Pakulat wrote:
>> On 09.11.06 16:43:00, Sibylle Koczian wrote:
>>> hopefully the subject line isn't too misleading. This is my problem:
>>> I would like to connect the "clicked" signal of several buttons to
>>> one and the same function - but this function should know which
>>> button sent the signal. Example: one button to increase a value,
>>> another to decrease it, and one single function which adds '+1' or
>>> '-1' depending on the sending button. Or a row of buttons with a
>>> letter, and clicking one searches for all words beginning with this
>>> letter in a list.
>>> How can I do this? Subclassing QPushButton seems to be a possibility,
>>> but is there a simpler way?
>> The unclean solution would be to use the sender() function, the proper
>> one is to have a look at QSignalMapper.
> An alternative pythonic way to do this is to do something like:
> class BoundCaller(object):
> """A callable class to wrap a function and its arguments."""
> def __init__(self, fn, *params):
> self.fn = fn
> self.params = params
> def __call__(self, *params):
> self.fn( *(self.params+params) )
> in your class:
> def __init__(self):
> self.myslot1 = BoundCaller(myslot, 1)
> self.myslot2 = BoundCaller(myslot, 2)
> self.connect(self.mybutton, SIGNAL('clicked()'), self.myslot1)
> def myslot(self, boundarg):
> print boundarg
> You have to keep a separate reference to the BoundCaller object (hence the
> assignment to self), otherwise it gets garbage collected.
I still think that connect not taking a reference on the slot is a mistake,
otherwise you could just use a lambda here.
Torsten Marek <shlomme at gmx.net>
ID: A244C858 -- FP: 1902 0002 5DFC 856B F146 894C 7CC5 451E A244 C858
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
-----END PGP SIGNATURE-----
More information about the PyQt