ホームページ >バックエンド開発 >Python チュートリアル >Tkinter For ループでボタン コマンドを割り当てるときに Lambda クロージャの問題を回避するにはどうすればよいですか?

Tkinter For ループでボタン コマンドを割り当てるときに Lambda クロージャの問題を回避するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-18 07:44:17178ブラウズ

How to Avoid Lambda Closure Issues When Assigning Button Commands in a Tkinter For Loop?

Lambda を使用した For ループでの Tkinter ボタン割り当てコマンド

Tkinter では、for ループを使用して複数のボタンを動的に作成する必要があるシナリオに遭遇することがあります。各ボタンには、それに関連付けられた固有のコマンドが必要です。ただし、コマンドのラムダ式内でループ変数を直接使用すると、潜在的な問題に直面する可能性があります。

次のコードを考えてみましょう。

users = {"Test": "127.0.0.0", "Test2": "128.0.0.0"}
row = 1
for name in users:
    user_button = Tkinter.Button(self.root, text=name,
                                 command=lambda: self.a(name))
    user_button.grid(row=row, column=0)
    row += 1

ここでの目的は、ユーザーごとに一意のパラメータ値を持つボタンを作成します。ただし、実行すると、すべてのボタンが最後に割り当てられた name 値を使用して a() メソッドを呼び出し、その結果、すべてのボタンに「Test2」が出力されます。

この問題に対処するには、ラムダ式。 name の現在の値を新しいパラメーターに割り当てることで、反復ごとに一意の関数を作成します。

user_button = Tkinter.Button(self.root, text=name,
                             command=lambda name=name: self.a(name))

これにより、各ボタンが対応する name パラメーターを持つラムダ関数の独自のインスタンスを持つことが保証されます。その結果、ボタンは意図したパラメータを使用して a() メソッドを正しく呼び出します。

以上がTkinter For ループでボタン コマンドを割り当てるときに Lambda クロージャの問題を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。