3

forループで作成された各ボタンをクリックすると、ボタン番号を出力しようとしています。以下は私が試したことです。

import Tkinter as tk
root=tk.Tk()

def myfunction(a):
        print a

for i in range(10):
    tk.Button(root,text='button'+str(i),command=lambda:myfunction(i)).place(x=10,y=(10+(25*i)))
root.mainloop()

しかし、各ボタン番号を印刷する代わりに、実際には毎回最後のボタン番号が表示されます。ボタン 1 をクリックしたときに 1,2 for 2 などを出力するようにできることはありますか?

4

4 に答える 4

2

Blender の答えは賢い解決策ですが、関数の抽象化に失敗した場合に備えて、別の方法があります。実際には、 に保存されたbuttonsButtonウィジェットから適切な番号へのマッピングを作成するだけです。

import Tkinter as tk
root = tk.Tk()

def myfunction(event):
    print buttons[event.widget]

buttons = {}
for i in range(10):
    b = tk.Button(root, text='button' + str(i))
    buttons[b] = i # save button, index as key-value pair
    b.bind("<Button-1>", myfunction)
    b.place(x=10,y=(10+(25*i)))
root.mainloop()
于 2013-04-18T05:09:04.790 に答える
0

これiは、匿名関数で値ではなくカウンター変数を参照するためです。

from __future__ import print_function

x = [lambda: print(i) for i in range(10)]

for f in x:
    f()

これにより、10 連続する9s の出力が生成されます。

これを回避するには、2 つlambdaの s とシャドウi2 番目の関数 (最初の関数を作成する) で使用する必要があります。

from __future__ import print_function

x = [(lambda i: (lambda: print(i)))(i) for i in range(10)]

for f in x:
    f()

ただし、その時点では、名前付き関数を作成するだけの方がよいでしょう:

def my_command(i):
    def inner_function():
        return my_function(i)

    return inner_function

そして、次のように使用します。

tk.Button(root, text='button' + str(i), command=my_command(i))
于 2013-04-18T04:36:10.250 に答える