Foros Python

Versión completa: Un ejemplo de PIL/Pillow
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola,
os pongo un ejemplo de como dibujar un tablero de ajedrez con esta libreria.
utiliza un validador de jugadas y control de la partida, el cual no lo pongo. Si estais interesados en estos temas os lo paso.

Bueno... a lo que vamos. Os pongo el programita:


Código:
# Python 3.6.1
from PIL import Image

# libreria que valida las jugadas y tablero interno
import pyajedrez.pyAjedrez_v3 as aje

piezas_png = {
   'b' : "imagenes/piezas/Merida60/bb.png",  #alfil negro
   'k' : "imagenes/piezas/Merida60/bk.png",  #rey negro
   'n' : "imagenes/piezas/Merida60/bn.png",  #caballo negro
   'p' : "imagenes/piezas/Merida60/bp.png",  #peon negro
   'q' : "imagenes/piezas/Merida60/bq.png",  #dama negra
   'r' : "imagenes/piezas/Merida60/br.png",  #torre negra
   
   'B' : "imagenes/piezas/Merida60/wb.png",  #alfil blanco
   'K' : "imagenes/piezas/Merida60/wk.png",  #rey blanco
   'N' : "imagenes/piezas/Merida60/wn.png",  #caballo blanco
   'P' : "imagenes/piezas/Merida60/wp.png",  #peon blanco
   'Q' : "imagenes/piezas/Merida60/wq.png",  #dama blanca
   'R' : "imagenes/piezas/Merida60/wr.png",  #torre blanca
   
   'False' : "imagenes/piezas/Merida60/clear.png"  #casilla transparente
}

escaques_png = {
   'negro' : "imagenes/piezas/Merida60/dark.png",  # casilla negra
   'blanco': "imagenes/piezas/Merida60/light.png"   # casilla blanca
}

TAMANO_ESCAQUE = 40
TAMANO_PIEZA = int(TAMANO_ESCAQUE * 0.90)   # el 90% de la casilla

# instanciamos la clase ajedrez
partida = aje.Ajedrez()

# para ajustar las imagenes
ajusta = Image.ANTIALIAS


def alterna_color_casilla(color_actual):
   if color_actual == escaques_png['negro']:
       return escaques_png['blanco']
   else:
       return escaques_png['negro']
   

def crea_tablero(jugada = None, tam_casilla = TAMANO_ESCAQUE, tam_pieza = TAMANO_PIEZA):
   img_fondo = Image.new("RGBA", (tam_casilla * 8, tam_casilla * 8), (255, 255, 255))
   dicc_piezas = partida.toArray()
   # tiene el formato:
   # dicc_piezas = {'a8': 'r', 'b8' : False, 'c4' : 'N', etc...}
   # creamos el tablero, casillas y puezas
   color_casilla = escaques_png['negro']
   
   #coords. para pegar las casillas y piezas
   tabula_fila = 0
   tabula_columna = 0
   
   for fila in range(8,0,-1):
       # empezamos por la casilla sup. izq. que es blanca
       color_casilla = alterna_color_casilla(color_casilla)    
       
       for columna in range(ord('a'), ord('i')):
           nombre_casilla = chr(columna) + str(fila)
           
           img = Image.open(color_casilla)
           img_casilla = img.resize((tam_casilla*8, tam_casilla*8), ajusta)
           
           # para centrar la pieza sobre cada casilla
           ancho_x, alto_y = img.size
           offset = ((ancho_x - alto_y) // 2, (ancho_x - alto_y) // 2)
           
           # buscamos la pieza que hay en nombre_casilla
           pieza = dicc_piezas[nombre_casilla]
           if not pieza :      #si la casilla esta vacia, esto es False
               pieza = 'False'
           
           # las piezas son transparentes: se añade el convert
           img_pieza = Image.open(piezas_png[pieza]).convert("RGBA")
           img_pieza = img_pieza.resize((tam_pieza, tam_pieza))
           img_casilla.paste(img_pieza, offset, img_pieza)
           img_fondo.paste(img_casilla, (tabula_columna, tabula_fila))
           
           tabula_columna = tabula_columna + tam_casilla
           color_casilla = alterna_color_casilla(color_casilla)
           
           
       tabula_columna = 0
       tabula_fila = tabula_fila + tam_casilla
       
   img_fondo.show()
   
   
   

def inicia_grafico():
   #print(partida.toArray())   es el tablero en forma de diccionario
   # empezamos dibujando el tablero de inicio
   crea_tablero()
   # hacemos una jugada
   jugada = partida.moveSAN('e4')
   crea_tablero()
   

if __name__ == "__main__":
   inicia_grafico()
   
   
"""
Todo esto es muy lento,
Mejor hacerlo en memoria. Para ello convertimos las imagenes en bytes y las guardamos:

#genera_piezas_BytesIO.py

import io, pickle

from PIL import Image

ficheros = {
   'b' : "./Merida45/bb.png",  #alfil negro
   'k' : "./Merida45/bk.png",  #rey negro
   'n' : "./Merida45/bn.png",  #caballo negro
   'p' : "./Merida45/bp.png",  #peon negro
   'q' : "./Merida45/bq.png",  #dama negra
   'r' : "./Merida45/br.png",  #torre negra
   
   'B' : "./Merida45/wb.png",  #alfil blanco
   'K' : "./Merida45/wk.png",  #rey blanco
   'N' : "./Merida45/wn.png",  #caballo blanco
   'P' : "./Merida45/wp.png",  #peon blanco
   'Q' : "./Merida45/wq.png",  #dama blanca
   'R' : "./Merida45/wr.png",  #torre blanca
   
   'None' : "./Merida45/clear.png"  #casilla transparente
}
piezas_png = {}

for nombre, pieza in ficheros.items():
   im = Image.open(ficheros[nombre])
   salida = io.BytesIO()
   im.save(salida, format="PNG")
   piezas_png[nombre] = salida.getvalue()


with open("piezas_png.py", "wb") as fich:
   fich.write(pickle.dumps(piezas_png))
   
###################################
Hariamos lo mismo para los escaques
###################################

luego, el programa de arriba lo modificariamos empezando con:

#tablero_png.py
import pickle
PIEZAS = pickle.load(open( "./pyajedrez/piezas_png.py", "rb" ))
etc....

###############################################
y por ultimo leeriamos las piezas y escaques asi:
p.ej. en Tkinter
###############################################

from tkinter import *
import io

from PIL import Image, ImageTk
import pyajedrez.tablero_png as tab

root = Tk()

frm = Frame(root)
frm.pack()

imagen_bytes = io.BytesIO(tab.PIEZAS['Q'])
image = Image.open(imagen_bytes)

tkimg = ImageTk.PhotoImage(image)
print(type(tkimg))
etiqueta = Label(frm, width=45, height=45, image = tkimg)
etiqueta.pack()

root.mainloop()
"""

el hilo lo he puesto aqui, porque no usa gui alguna.

espero que os sirva la idea.

saludos.

Edito:

Pongo el enlace para descargar el ejemplo completo funcionando. Está escrito a vuelapluma en un par de horas, pero funciona. Explicaciones en el fichero LEEME.txt

Ejemplo uso Pillow
Hola calvicius, muchas gracias por el código.

Saludos!