Estoy intentando implementar un juego llamado "Cinco en fila". Y creo una lista de 15 × 15 para poner los botones. (Usé range (16) porque también quiero una fila y una columna para mostrar el número de fila y el número de columna)

Espero que mi implementación sea como cuando se hace clic en un botón, se convierte en una etiqueta. Pero no sé en qué botón hace clic el usuario.

¿Cómo puedo implementar eso? ¡Gracias!

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()

Hay una pregunta similar ¿Cómo determinar qué botón se presiona fuera de la cuadrícula de botones en Python TKinter?. Pero no lo entiendo del todo.

3
Seaky Lone 15 nov. 2017 a las 00:45

2 respuestas

La mejor respuesta

Para pasar la instancia del botón al comando, debe hacerlo en dos pasos. Primero, cree el botón y luego, en un segundo paso, configure el comando. Además, debe usar una lambda para crear lo que se llama un cierre .

Por ejemplo:

obj=Button(root,relief=FLAT,width=2)
obj.configure(command=lambda button=obj: p(button))
5
Bryan Oakley 14 nov. 2017 a las 22:41

Cuando usa command = p(obj), en realidad está llamando a la función p. Si desea pasar una función con parámetros, debe crear una función lambda. Por lo tanto, la asignación del comando debería ser algo como:

command = lambda: p(obj)

Eso pasará el objeto correctamente a la función p.

1
Sergio Abreu García 14 nov. 2017 a las 22:12