ホームページ > バックエンド開発 > Python チュートリアル > 予期せぬ動作をせずに PyQt4 でスロットとシグナルを動的に接続する方法は?

予期せぬ動作をせずに PyQt4 でスロットとシグナルを動的に接続する方法は?

DDD
リリース: 2024-11-11 19:50:03
オリジナル
840 人が閲覧しました

How to Connect Slots and Signals Dynamically in PyQt4 Without Unexpected Behavior?

PyQt4 でスロットとシグナルを動的に接続する

PyQt4 では、複数のスロットをプログラムでシグナルに接続すると、ループ内で実行すると予期しない動作が発生する可能性があります.

問題:

ループ内に動的に生成された数字ボタンを備えた電卓を作成することを検討してください。各ボタンの 'clicked()' 信号が次のように接続されている場合:

def __init__(self):
    for i in range(0, 10):
        self._numberButtons += [QPushButton(str(i), self)]
        self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda : self._number(i))
ログイン後にコピー

問題:

いずれかのボタンをクリックすると、すべて '9 が出力されます。 '。この動作は、Python のスコープとクロージャーのセマンティクスから発生します。ラムダ式は変数 i を参照し、ループ内で最終値 '9' に評価されます。

解決策:

この問題を回避するには、i を渡します。デフォルト値を持つキーワード引数として使用します:

self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
ログイン後にコピー

または、よりクリーンなアプローチとして functools.partial を使用します:

self._numberButtons[i].clicked.connect(partial(self._number, i))
ログイン後にコピー

これらのソリューションは、ラムダ式内で i を分離し、それぞれがボタンをクリックすると、意図したアクションがトリガーされます。

以上が予期せぬ動作をせずに PyQt4 でスロットとシグナルを動的に接続する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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