ループ内で接続すると、PyQt4 ボタンがすべて同じ値を出力するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-11 17:22:03
オリジナル
504 人が閲覧しました

Why Do My PyQt4 Buttons All Print the Same Value When Connected in a Loop?

ループ内の 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート