Tkinter では、ループ内にボタンを作成するのは簡単です。ただし、各ボタンのコマンドに特定の引数を渡すのは難しい場合があります。
「ゲーム 1」から「ゲーム 3」というタイトルを持つ 3 つのボタンを作成しようとする次のシナリオを考えてみましょう。ボタンが押されたときに、どのボタンがアクションをトリガーしたかを識別できるように、対応する数値をコマンド引数に渡すつもりです。
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)
残念ながら、このコードは意図したとおりに機能しません。いずれかのボタンが押されると、出力される値は常に 2 (ループの最後の反復) です。この問題は、ラムダ関数が各ボタンの作成時の i の値ではなく、ループの最後で i の値を使用するために発生します。
この問題を解決するには、次のようにします。各ボタンのコマンドの周囲にクロージャを作成する必要があります。これは、構文 lambda i=i: self.open_this(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)
を使用することで実現できます。この変更により、各ボタンのコマンドは作成時に i の特定の値を取得します。ボタンが押されると、クロージャーは i の正しい値が open_this 関数に確実に渡されるようにします。
以上がループ変数を Tkinter ボタン コマンドに正しく渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。