I am trying to implement a game called "Five In a Row". And I create a 15×15 list to put the buttons. (I used range(16) because I also want a row and a column to display the row number and column number)
I hope my implementation will be like when a button is clicked, it becomes a label. But I don't know which button the user clicks.
How am I able to implement that? Thanks!
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()
There is a similar question How to determine which button is pressed out of Button grid in Python TKinter?. But I don't quite get that.
To pass the button instance to the command, you must do it in two steps. First, create the button, and then in a second step you configure the command. Also, you must use a lambda to create what's called a closure.
For example:
obj=Button(root,relief=FLAT,width=2)
obj.configure(command=lambda button=obj: p(button))
When you use command = p(obj)
you are actually calling the function p
. If you want to pass a function with parameters you should create a lambda function. Therefore, the command assignment should be something like:
command = lambda: p(obj)
That will pass the object properly into p
function.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With