一意のコマンド引数を使用して tkinter でボタンをプログラム的に作成する
当面のタスクは、for ループを使用して tkinter インターフェース内に複数のボタンを生成することです。各ボタンには、現在の反復回数を表す一意のコマンド引数が含まれている必要があります。ただし、既存のコードでは、一貫した値が出力されたボタンが生成されます。これは、コマンド引数の割り当てに潜在的な問題があることを示しています。
問題: 反復値の消失
提供されたコードは、 「ゲーム 1」から「ゲーム 3」までのタイトルが付いたボタン。これらのボタンのいずれかをクリックすると、出力される値は常に 2 で、最後の反復回数に対応します。これは、コマンド引数が個々のボタンに関連付けられているのではなく、単一のエンティティとして扱われていることを示唆しています。
解決策: 反復値の保持
この問題を解決するには、各ボタンのコマンドを定義するときに現在の反復値 (i) を保存します。これを実現するには、変更されたラムダ式が必要です。
command=lambda i=i: self.open_this(i)
このラムダ式は、i の現在の値を i という名前の変数に割り当てます。これにより、作成時に i 値が取得され、特定のボタンに付加されることが保証されます。その結果、各ボタンは固有の反復回数にアクセスできるようになります。
Lambda クロージャを理解する
i=i を使用すると、クロージャは i の現在の値を保存します。関数が呼び出されたときの 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)
これで、いずれかのボタンをクリックすると、対応する反復回数が正確に出力され、最初の問題は解決されました。
以上がTkinter ボタン ループのコマンドに一意の引数を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。