I have a dictionary whose keys are the names of all the dials in my PyQT interface. The values associated with these keys are certain numeric values associated with each dial that need to be passed to a handler function (to determine which dial was moved), along with the new value of that dial.
I've used functools.partial to create a different instance of the handler function for each of the numeric values, but the "valueChanged" signal returns an integer and I'm not sure how to pass it into the partial function as well. The following doesn't seem to work, as the dialChanged function ends up never being called:
for dial, cc, in dialDict.iteritems(): getattr(self.ui, dial).setRange(0,127) getattr(self.ui, dial).valueChanged.connect( lambda value: partial(self.windowHandler.dialChanged, mainWindowInstance=self, cc=cc, value=value))
I think the problem has to do with the use of the lambda function inside the for loop and scope, but I'm not sure how to otherwise go about passing the return value of the valueChanged signal into the slot created by partial. Any suggestions would be appreciated.
dialChanged- Niklas B. 2012-04-04 00:40
I actually think it does make sense to use partial here, and ditch the lambda, but to make your
dialChanged handler have a callback friendly signature:
# where ever this is defined def dialChanged(value, mainWindowInstance=None, cc=None): pass cbk = partial( self.windowHandler.dialChanged, mainWindowInstance=self, cc=cc) .valueChanged.connect(cbk)
The slot is going to be called with a value arg, so this should line up with the signature I would think. The lambda is only necessary if you don't have control over that dialChanged slot function and you need to completely reformat the signature by wrapping around the call.