1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
   | import tkinter as tk
 
DIM_GRILLE = (8, 8)
DIM_CASE = 50
DIM_LIGNE = 1
 
DIM_CANEVAS = (
    DIM_GRILLE[0]*DIM_CASE + (DIM_GRILLE[0]+1)*DIM_LIGNE,
    DIM_GRILLE[1]*DIM_CASE + (DIM_GRILLE[1]+1)*DIM_LIGNE
)
 
 
def destroyer(evt) :
    r = can.find_overlapping(evt.x, evt.y, evt.x, evt.y)
    print("CLOSEST = "+str(can.find_closest(evt.x, evt.y, evt.x, evt.y)))
    print("OVERLAPPING= "+str(r))
    print("CURRENT= "+str(can.find_withtag('current')))
    if not r :
        return
    rid = r[0]
 
    # Récupération des index ligne et colonne contenant l'id rectangle
    for il, ligne in enumerate(items) :
        if rid in ligne :
            ic = ligne.index(rid)
            break
 
    # Suppressions de la ligne et colonne du tableau items
    # Et suppression dans le canevas
    lid = items.pop(il)
    for oid in lid :
        can.delete(oid)
 
    for ligne in items :
        oid = ligne.pop(ic)
        can.delete(oid)
 
    if not any(items) :
        # Plus rien à faire, le tableau d'items est vide.
        return
 
    nombreLignes = len(items)
    nombreColonnes = len(items[0])
 
    # Calculs des dimensions de chaque lignes
    # Soustraction des lignes de la hauteur du canevas
    hautCan = DIM_CANEVAS[1] - (nombreLignes+1) * DIM_LIGNE
    # Répartition de la hauteur
    hauteurs = [hautCan // nombreLignes] * nombreLignes
    for i in range(hautCan % nombreLignes) :
        hauteurs[i] += 1
 
    # Calculs des dimensions de chaque colonnes
    largCan = DIM_CANEVAS[0] - (nombreColonnes+1) * DIM_LIGNE
    largeurs = [largCan // nombreColonnes] * nombreColonnes
    for i in range(largCan % nombreColonnes) :
        largeurs[i] += 1
 
    # Mises à jour des dimensions
    ih = 0
    y = DIM_LIGNE
    for ligne in items :
        il = 0
        x = DIM_LIGNE
        for oid in ligne :
            can.coords(oid, x, y, x+largeurs[il], y+hauteurs[ih])
            x += largeurs[il] + DIM_LIGNE
            il += 1
        ih += 1
        try :
            y += hauteurs[ih] + DIM_LIGNE
        except IndexError :
            # Dernier tour de boucle
            break
 
 
fenetre = tk.Tk()
 
can = tk.Canvas(
    fenetre,
    width=DIM_CANEVAS[0],
    height=DIM_CANEVAS[1],
    bg='black',
    highlightthickness=0,
)
can.grid()
 
items = []
colors = ['red', 'yellow']
y = DIM_LIGNE
 
for ligne in range(DIM_GRILLE[1]) :
    x = DIM_LIGNE
    ids = []
    colors.reverse()
    for col in range(DIM_GRILLE[0]) :
        i = can.create_rectangle(
            x, y, x+DIM_CASE, y+DIM_CASE,
            fill=colors[col % 2],
            width=0,
        )
        ids.append(i)
        x += DIM_CASE + DIM_LIGNE
    items.append(ids)
    y += DIM_CASE + DIM_LIGNE
 
can.bind('<Button-1>', destroyer)
 
fenetre.mainloop() |