ホームページ >バックエンド開発 >Python チュートリアル >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 サイトの他の関連記事を参照してください。