2

私はpyqtに次のようなボタンを備えたpythonプログラムを持っています:

this=[1,k]   
button.clicked.connect(lambda x=this:self.testFunction(str(x)))

ボタンを押すと、testFunction(False)むしろtestFunction(str([1,k])). 理由はありますか?前もって感謝します。

4

1 に答える 1

6

その理由は、あなたがどのように機能するかを誤解しているから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であるかどうかに応じて、 1orの文字列キャストを渡します。kTrueFalse

于 2013-09-18T02:11:09.117 に答える