4

for ループを使用して、複数の番号付きコマンドを Tkinter メニューに追加しようとしています。コマンドが呼び出されると、その番号がコマンド関数の引数として使用されることになっています。次のコードは、ループの終了後にコマンドが呼び出されたときに i が評価されるため、機能しません。これは、function1 に渡される引数が常に 15 であることを意味しますが、コマンド ラベルに表示される数値を渡すつもりでした。これを達成する方法はありますか?

注: ラベル付けは意図したとおりに機能し、0 ~ 15 のラベルが付いた 16 のオプションが生成されます。

newMenu = Menu(menuButtonInstance)
for i in range(16):
    newMenu.add_command(label = '%s'%i,
                        command = lambda:function1(i))
menuButtonInstance.config(menu = newMenu)

前もって感謝します

4

1 に答える 1

4

の遅延バインディングを処理するためによく使用される方法の 1 つlambdaは、変化する変数にデフォルト値が設定された引数を lambda に与えることです。

    newMenu.add_command(label='{0}'.format(i),
                        command=lambda x=i: function1(x))

別の可能性はpartialfromを使用することですfunctools:

    newMenu.add_command(label='{0}'.format(i),
                        command=partial(function1, i))

PEP8は、キーワード引数で使用する場合、両側にスペース文字を使用しないことを推奨していることに注意してください=。一方、例のように、すべての演算子の周りにスペース文字を配置する必要%があります)

于 2012-06-18T08:09:01.590 に答える