Python Tkinter按钮回调

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,依此类推?

lin*_*urn 9

简单的解决方法是每次创建lambda函数时使用当前值i初始化lambda函数.这可以使用另一个虚拟变量j的Python默认值来完成.

command = lambda j=i: myfunction(j)
Run Code Online (Sandbox Code Playgroud)


Jar*_*red 4

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)