私はpyqtに次のようなボタンを備えたpythonプログラムを持っています:
this=[1,k]
button.clicked.connect(lambda x=this:self.testFunction(str(x)))
ボタンを押すと、testFunction(False)
むしろtestFunction(str([1,k]))
. 理由はありますか?前もって感謝します。
その理由は、あなたがどのように機能するかを誤解しているからlambda
です。Lambda は、指定した定義で匿名関数を返します。この関数の呼び出しに引数のデフォルトlambda x=this:
がない場合は、代わりにこれを使用すると言っています。x
観察:
l = lambda x=3: x*2
print l(10) # Prints 20
print l() # Prints 6
QPushButton.clicked()
(inherited from QAbstractButton)のドキュメントを確認すると、ブール値の引数で起動することがわかります。
したがって、この行では:
button.clicked.connect(lambda x=this:self.testFunction(str(x)))
ラムダ関数には常に引数が渡されます。この引数は から渡され、 またはQPushButton.clicked()
のいずれTrue
かになりますFalse
。したがって、デフォルトのthis
は使用されません。代替として、次を使用できます。
button.clicked.connect(lambda x:self.testFunction(str(this)))
しかし、配列 this の文字列バリアントを常に関数に渡すため、おそらくそれはあなたが望むものではありません。一方、これ:
button.clicked.connect(lambda x:self.testFunction(str(this[x])))
渡された引数がorであるかどうかに応じて、 1
orの文字列キャストを渡します。k
True
False