ホームページ >バックエンド開発 >Python チュートリアル >ループ変数を Tkinter ボタン コマンドに正しく渡すにはどうすればよいですか?

ループ変数を Tkinter ボタン コマンドに正しく渡すにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-24 17:56:10179ブラウズ

How Can I Pass Loop Variables Correctly to Tkinter Button Commands?

ループ変数を Tkinter ボタン コマンドに渡す

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 サイトの他の関連記事を参照してください。

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