The reason is that you are misinterpretting how lambda works. Lambda returns an anonymous function with the definition you give it. By saying lambda x=this: you are saying if the call to this function doesn't have an x argument default to use this instead.
Observe:
l = lambda x=3: x*2
print l(10) # Prints 20
print l() # Prints 6
If we check the documentation for QPushButton.clicked() (inherited from QAbstractButton), we see that it fires with a boolean argument.
So in this line:
button.clicked.connect(lambda x=this:self.testFunction(str(x)))
The lambda function always gets passed an argument, which is passed from QPushButton.clicked() and will be either True or False. Hence the default of this is never used. As an alternate you could use:
button.clicked.connect(lambda x:self.testFunction(str(this)))
But that isn't probably what you want, as it will always pass the string variant of the array this to the function. On the other hand this:
button.clicked.connect(lambda x:self.testFunction(str(this[x])))
Will pass the string casting of their 1 or k depending on whether the passed argument is True or False.
thisto, say,theseon both lines? (This will either fix the problem or disprove the hypothesis that something is settingthistoFalsebetween the first line and the second.)eventfor a first argument:button.clicked.connect(lambda event, x=this: self.testFunction(str(x)))