¿Por qué no se muestran las imágenes de las primeras dos instancias de WhitePawn()?
Aquí está mi código:
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.image import Image
from kivy.uix.relativelayout import RelativeLayout
class PeonBlanco():
def init(self):
self.source = ‘whitepawn.png’
class CubeWidget(RelativeLayout):
def init(self, color, id, piece,kwargs):
self.color = color
self.id = id
self.piece = piece
super().init(kwargs)
if self.piece:
self.img = Image(source=’whitepawn.png’)
self.add_widget(self.img)
def on_touch_down(self, touch):
if self.collide_point(touch.x, touch.y):
print(self.id, self.pos)
return True
return super().on_touch_down(touch)
class NuevoTablero(GridLayout):
def init(self, kwargs):
super().init(kwargs)
self.tablero = []
self.tema = None
self.generar_tablero()
def generar_tablero(self):
a = [(PeonBlanco(), 1, 1), (PeonBlanco(), 2, 2), (PeonBlanco(), 3, 3)]
for i in range(8):
for j in range(8):
color = (0,1,0,1) if (i+j)%2!=0 else (1,1,1,1)
for k in a:
if (k[1],k[2]) == (i,j):
cube = CubeWidget(color, (i,j), k[0])
self.tablero.append((k[0], cube))
else:
cube = CubeWidget(color, (0,0), None)
self.add_widget(cube)
class MiAplicacionDeAjedrez(App):
def build(self):
tablero = NuevoTablero()
return tablero
MiAplicacionDeAjedrez().run()
sólo la última instancia del peón blanco está mostrando la imagen, ninguna otra.
davy.ai
El código proporcionado crea una clase
New_Board
que es unaGridLayout
con cubos de 8×8. Cada cubo es unCubeWidget
que toma como argumentos un color, un id y una pieza. Si el argumentopiece
no esNone
, se añade unaImage
alCubeWidget
con la fuentewhitepawn.png
.El método
gen_board
crea una lista de tuplas que contiene una instancia deWhitePawn
y dos enteros. Luego itera a través de la cuadrícula de 8×8 y comprueba si los dos enteros de la tupla coinciden con la fila y columna actuales. Si coinciden, se crea unCubeWidget
con la instancia deWhitePawn
como argumento depiece
. En caso contrario, se crea unCubeWidget
conNone
como argumento depiece
.El problema es que sólo se muestra la imagen de la última instancia de
WhitePawn
, no se muestra ninguna de las demás. Esto se debe a que el métodogen_board
está sobrescribiendo losCubeWidget
con la instancia deWhitePawn
con losCubeWidget
conNone
como argumento depiece
. Para solucionarlo, el métodogen_board
debe ser modificado para crear sóloCubeWidget
con instancias deWhitePawn
si los dos enteros de la tupla coinciden con la fila y columna actuales.