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