ループ内の PyQt4 のスロットとシグナルの接続: バインド チェーンの解除
この記事では、接続中に発生する一般的な問題に対処しますclicked() は、PyQt4 のループ内で作成されたボタンからのシグナルを送信します。私たちは、各ボタンがラベルに基づいて固有のアクションをトリガーする必要があるにもかかわらず、すべてのボタンが同じ値を出力する理由を理解することを目的としています。
スコープとクロージャについて
提供された例で観察された動作は、Python のスコープとクロージャーのメカニズムの結果です。ループ内でボタンを作成するときは、その clicked() シグナルをラムダ関数に接続しようとします。ただし、Python は、関数の割り当てまたはパラメーター リストを通じて名前空間に新しいバインディングを導入するだけです。
したがって、ラムダ関数はループ変数 i に対する独自のバインディングを持たず、代わりに、次の名前空間でそれを探します。囲んでいる関数 __init__()。ラムダが実行される時点で、i には最終値 9 がすでに割り当てられており、すべてのボタンに同じ出力が出力されます。
解像度
アドレスこの問題では、デフォルト値を持つキーワード引数として i をラムダ関数に渡すことができます。これにより、ラムダ内の i が __init__() 内の i から独立していることが保証されます。あるいは、functools.partial 関数を使用すると、同じ結果を得るために、より読みやすく、「魔法」の少ないアプローチを提供できます。
キーワード引数を使用した例:
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
functools.partial の例:
self._numberButtons[i].clicked.connect(partial(self._number, i))
これらのアプローチの 1 つを実装することで、各ボタンとそれぞれのアクションの間に必要なバインドを正常に確立できます。
以上がループ内で接続すると、PyQt4 ボタンがすべて同じ値を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。