ホームページ >バックエンド開発 >Python チュートリアル >Tkinter ループで作成されたボタンにコマンドをバインドするときに予期しない動作を回避するにはどうすればよいですか?

Tkinter ループで作成されたボタンにコマンドをバインドするときに予期しない動作を回避するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-20 00:51:11357ブラウズ

How to Avoid Unexpected Behavior When Binding Commands to Buttons Created in a Tkinter Loop?

コマンド引数バインドを使用した Tkinter ループ ボタンの作成

Tkinter では、for ループ内でボタンを作成すると、各ボタンのコマンドを一意の引数でバインドしようとすると課題が発生する可能性があります。

次の点を考慮してくださいscenario:

def createGameURLs(self):
    self.button = []
    for i in range(3):
        self.button.append(Button(self, text='Game '+str(i+1),
                                  command=lambda: self.open_this(i)))
        self.button[i].grid(column=4, row=i+1, sticky=W)

def open_this(self, myNum):
    print(myNum)

このコードを実行すると、ボタンを押すと常に同じ値 (通常は最後の反復値) が出力されるという奇妙な動作が発生する可能性があります。これは、ループ内で作成された各ラムダ関数が同じ変数 i を参照し、ループの反復ごとに更新されるために発生します。

解決策: クロージャの利用

この問題に対処するには、Python のクロージャを利用できます。 i をラムダ関数内の新しい変数に代入することで、各ボタンに一意のスコープが効果的に作成されます。変更されたコードは次のとおりです。

def createGameURLs(self):
    self.button = []
    for i in range(3):
        self.button.append(Button(self, text='Game '+str(i+1),
                                  command=lambda i=i: self.open_this(i)))
        self.button[i].grid(column=4, row=i+1, sticky=W)

def open_this(self, myNum):
    print(myNum)

クロージャーを組み込むことにより、各ラムダ関数は定義時に現在の i 値をキャプチャし、正しいボタンの動作を保証します。

以上がTkinter ループで作成されたボタンにコマンドをバインドするときに予期しない動作を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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