Python tkinter查找单击的按钮
我正在尝试实现一个名为“五连胜”的游戏。 我创建了一个15×15的列表来放置按钮。(我使用range(16),因为我还需要一行和一列来显示行号和列号) 我希望我的实现将像单击按钮时一样,它将成为一个标签。 但我不知道用户点击了哪个按钮 我如何才能实现这一点?谢谢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=
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
中的最后一个值。请看一个解释。非常感谢!谢谢你为我解决了很多问题。