Voilà j'ai un projet en Info à rendre sur Tkinter.
Je dois rendre un programme qui affiche une grille dans laquelle on peut dessiner ( en remplissant des rectangles avec de la couleur) et qui doit enregistrer et charger la matrice du dessin.
J'ai essayé plusieurs solutions, dont certaines trouvées sur ce forum mais rien ne fonctionne. Je vous donne le code de mon programme. La partie en rouge est celle qui me pose problème. ( parmi celle-ci, la partie en commentaire correspond à l'ancien fonction qui ne marchait pas non plus)
Merci d'avance !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
from Tkinter import *
import tkFileDialog 
import tkFont
 
# Variables utilisées
 
xo = 10
yo =10
c = 30
nombreligne = 10
nombrecolonne=10
couleur = "black"
 
def dessine_grille(): # fonction creant la grille
    for i in range(nombreligne+1):
        can.create_line(xo+c*i, yo,xo+c*i,yo + nombreligne*c)
        can.create_line(xo, yo+c*i,xo+nombrecolonne*c ,yo+c*i)
 
def affiche (self): # Ouvrir le fichier recherché
    nomfichier = tkFileDialog.askopenfilename(parent=root, mode = "rb", ttle="Choisir un fichier")
    if nomfichier != None:
        data = nomfichier.read()
        nomfichier.close ()
        self.entree.delete (0.0, END)
        self.entree.insert (0.0,END)
 
def correspond(x,y): # Coordonnées x et y
    return [(y-yo)/c,(x-xo)/c]
 
def cree_mat (): # matrice de base
    mat = []
    for i in range(nombreligne):
        col = []
        for j in range(nombrecolonne):
            col.append(0)
        mat.append(col)
    return mat
 
matrice = cree_mat ()
 
def position(event): # Position de la souris dans le canevas
    global couleur
    global matrice
    [i,j]=correspond(event.x,event.y)
    if i in range(nombreligne) and j in range (nombrecolonne):
        can.create_rectangle(xo +c*j,yo+c*i,xo +c*(j+1),yo+c*(i+1),fill=couleur)
        if couleur=="white":
            matrice[i][j]=0
        else:
            matrice[i][j]=couleur
 
def monquitter(): # Fonction quitter
    fen.quit()
    fen.destroy()
 
def ecriture (matrice,fichier):
    fichierEcriture=open(fichier,"w")
    fichierEcriture.write(str(nombreligne)+ '\n')
    fichierEcriture.write(str(nombrecolonne)+'\n')
    for ligne in matrice:
        for valeur in matrice:
            fichierEcriture.write(str(valeur))
        fichierEcriture.write('\n')
    fichierEcriture.close ()
 
####################################
def save ():
    fichier=sauv.get()
    ecriture(matrice,fichier)
####    nomfichier = tkFileDialog.asksaveasfile(parent = root, title ="Sauvegarder")
##    nomfichier=sauv.get()
##    if len(nomfichier) > 0:
##        data = open (nomfichier, "w")
##        #txt = self.entree.get (0.0, END)
##        for i in range(nombreligne):
##            ligne=""
##            for j in range(nombrecolonne):
##                ligne=ligne+str(matrice[i][j])+" "
##            ligne=ligne+"\n"         
##            data.write (ligne)
##            data.close ()
 
def sauvegarde (): # Sauvegarder
    sauv.grid(column=1001,row=4)
    Lsauv.grid(column=1001,row=3)
    Button.grid_forget (be)
####################################
 
def lire (): # Fonction permettant de charger
    charg=Entry(fen)
    Lcharg=Label(fen, text="nom du fichier a recuperer")
    charg.grid(column=1001,row=5)
    Lcharg.grid(column=1001,row=4)
    Button.grid_forget (bc)
    be.grid(row = 2, column = 1001)
    l = charg.get
    charg.bind ("<Return>", affiche)
 
def gomme (): # Fonction de la gomme pour effacer les couleurs actuelles sur le canevas
    global couleur
    couleur = "white"
 
# Fonctions couleur
 
def rouge ():
    global couleur
    couleur = "red"
 
 
def vert ():
    global couleur
    couleur = "green"
 
 
def bleu ():
    global couleur
    couleur = "blue"
 
 
def jaune ():
    global couleur
    couleur = "yellow"
 
 
 
# Widgets
 
fen=Tk()
 
can=Canvas(fen,width=400,height=400,bg="white")
can.grid(column=0, row =1, rowspan = 1000, columnspan=1000)
 
bd=Button(fen,text="Nouvelle grille",command=dessine_grille, font=("courrier","12","bold"))
bd.grid(row = 1, column=1001)
 
bc=Button(fen,text="Sauvegarde",command=sauvegarde, font=("courrier","12","bold"))
bc.grid(row = 2, column = 1001)
 
be=Button(fen,text="Charger",command=lire, font=("courrier","12","bold"))
be.grid(column=1001, row = 3)
 
bg=Button(fen,text="Gomme",command=gomme)
bg.grid(column=0, row = 1004)
 
bq=Button(fen,text="Quitter",command=monquitter)
bq.grid(column=1001, row =1005)
 
br= Button (fen, text="", command=rouge, bg ="red")
br.grid (column = 500, row=1002)
 
by= Button (fen, text="", command=jaune, bg ="yellow")
by.grid (column = 500, row=1003)
 
bb= Button (fen, text="", command=bleu, bg ="blue")
bb.grid (column = 500, row=1004)
 
bv= Button (fen, text="", command=vert, bg ="green")
bv.grid (column = 500, row=1005)
 
Ltitre=Label (fen, text="Tp Note Sophie et Capucine", fg = "red", font =("courrier","10"))
Ltitre.grid (column=500, row =0)
 
sauv=Entry(fen)
Lsauv=Label(fen, text="nom du fichier de sauvegarde")
 
sauv.bind ("<Return>", save)
 
 
can.bind ("<Button-1>", position)
 
fen.mainloop()