Chr*_*ung 3 python tkinter callback button
当我单击由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()
Run Code Online (Sandbox Code Playgroud)
但不是打印出每个按钮编号,而是每次都给我最后一个按钮编号.有什么我可以这样做,当我点击按钮1,它将打印1,2为2,依此类推?
简单的解决方法是每次创建lambda函数时使用当前值i初始化lambda函数.这可以使用另一个虚拟变量j的Python默认值来完成.
command = lambda j=i: myfunction(j)
Run Code Online (Sandbox Code Playgroud)
Blender 的答案是一个聪明的解决方案,但如果你被函数抽象迷惑了,这里有另一种可能的方法。它实际上只是创建一个映射,保存在 中buttons,从小Button部件到它们的正确编号。
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()
Run Code Online (Sandbox Code Playgroud)