Python tkinter查找单击的按钮

Python tkinter查找单击的按钮,python,tkinter,Python,Tkinter,我正在尝试实现一个名为“五连胜”的游戏。 我创建了一个15×15的列表来放置按钮。(我使用range(16),因为我还需要一行和一列来显示行号和列号) 我希望我的实现将像单击按钮时一样,它将成为一个标签。 但我不知道用户点击了哪个按钮 我如何才能实现这一点?谢谢 from tkinter import * root=Tk() root.wm_title("Five In a Row") buttonlst=[ list(range(16)) for i in range(16)] chess=

我正在尝试实现一个名为“五连胜”的游戏。 我创建了一个15×15的列表来放置按钮。(我使用range(16),因为我还需要一行和一列来显示行号和列号)

我希望我的实现将像单击按钮时一样,它将成为一个标签。 但我不知道用户点击了哪个按钮

我如何才能实现这一点?谢谢

from tkinter import *
root=Tk()
root.wm_title("Five In a Row")
buttonlst=[ list(range(16)) for i in range(16)]

chess=Label(root,width=2,height=2,text='0')

def p(button):
    gi=button.grid_info()
    x=gi['row']
    y=gi['column']
    button.grid_forget()
    chess.grid(row=x,column=y)
    buttonlst[x][y]=chess

for i in range(16):
    for j in range(16):
        if i==0:
            obj=Label(root,width=2,text=hex(j)[-1].upper())
        elif j==0:
            obj=Label(root,width=2,text=hex(i)[-1].upper())
        else:
            obj=Button(root,relief=FLAT,width=2,command=p(obj))
        obj.grid(row=i,column=j)
        buttonlst[i][j]=obj

root.mainloop()

还有一个类似的问题。但是我不太明白。

当您使用
command=p(obj)
时,您实际上是在调用函数
p
。如果要传递带有参数的函数,应创建lambda函数。因此,命令分配应类似于:

command = lambda: p(obj)

这将正确地将对象传递到
p
函数中。

要将按钮实例传递给命令,必须分两步执行。首先,创建按钮,然后在第二步中配置命令。此外,必须使用lambda创建所谓的闭包

例如:

obj=Button(root,relief=FLAT,width=2)
obj.configure(command=lambda button=obj: p(button))

这看起来与您链接到的问题完全相同。你没有得到答案的哪一部分?你能说得更具体一点吗?@BryanOakley我不知道他是如何存储按钮信息的。如果你想确定按下哪个按钮,你至少可以有一个以按钮位置信息为参数的函数。如果在循环中调用此代码,并且obj在每次迭代中都不同,那么这将不起作用。为什么不呢
obj
在每次迭代中都与之前分配的不同,因此
命令
为每个新按钮采用正确的变量引用。
obj
在循环期间不同,但lambda不会在循环中运行,因此它将拾取存储在
obj
中的最后一个值。请看一个解释。非常感谢!谢谢你为我解决了很多问题。