[PyKDE] "sender" info in Python slot

Torsten Marek shlomme at gmx.net
Thu Nov 9 20:54:23 GMT 2006

Hash: SHA1

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
Keyserver: subkeys.pgp.net

Version: GnuPG v1.4.5 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org


More information about the PyQt mailing list