Echanges autour d'EduPython.
Vous n'êtes pas identifié(e).
Bonjour, je ne comprend pas pourquoi je n'arrive pas à récupérer la valeur de enCode dans le programme suivant
Merci de bien vouloir m'éclairer.
from tkinter import * # module donnant accés aux boites de dialogue standard pour la recherche de fichier sur disque from tkinter.filedialog import asksaveasfile,askopenfile class Application(Frame): " Fenetre d application" def __init__(self): Frame.__init__(self) self.master.title("Création d'un dictionnaire de couleurs") self.dico = {} # création du dictionnaire # les widgets sont regroupés dans deux cadres ( Frames) : frSup =Frame(self) # cadre superieur contenant 6 widgets Label(frSup, text = "Nom de la couleur :", width = 20).grid(row =1, column=1) self.enNom =Entry(frSup, width =25) # champ d'entrée pour le nom de la couleur self.enNom.grid(row=1, column=2) Button(frSup, text="Existe déjà ?", width =12, command = self.chercheCoul).grid(row=1, column=3) Label(frSup, text="code hexa corresp :", width = 20).grid(row=2, column=1) self.enCode = Entry(frSup,width=25).grid(row=2, column=2) # champ d'entrée pour le code hexa Button(frSup, text="test", width=12, command=self.testeCoul).grid(row=2, column=3) frSup.pack(padx=5, pady=5) frInf =Frame(self) # cadre inferieur pour le reste self.test = Label(frInf, bg="white",width=45, height=7, relief = SUNKEN) self.test.pack(pady=5) Button(frInf, text="Ajouter la couleur au dictionnaire",command=self.ajouteCoul).pack() Button(frInf, text="Enregistrer le dictionnaire",width=25, command=self.enregistre).pack(side=LEFT,pady=5) Button(frInf, text="Restaurer le dictionnaire",width=25, command=self.restaure).pack(side=RIGHT, pady=5) frInf.pack(padx=5, pady=5) self.pack() def ajouteCoul(self): " ajouter la couleur présente au dictionnaire" if self.testeCoul() ==0: # une couleur a t elle été définie ? return nom = self.enNom.get() if len(nom)>1: # refuser les noms trop petits self.dico[nom] = self.cHexa else: self.test.config(text= "%s : nom incorect" % nom, bg='white') def chercheCoul(self): " rechercher une couleur déjà inscrite dans le dictionnaire" nom= self.enNom.get() if nom in self.dico: self.test.config(bg=self.dico[nom], text="") else: self.test.config(text = "%s : couleur inconue" % nom, bg='white') def testeCoul(self): " verifier la validite d un code hexa Afficher la couleur correspondante" try: self.cHexa = self.enCode.get() self.test.config(bg=self.cHexa, text="") return 1 except: self.test.config(text="Codage de couleur incorect", bg='white') return 0 def enregistre(self): " enregistrer le dictionnaire dans un fichier texte" # cette méthode utilise une boite de dialogue standard pour la # sélection d'un fichier sur disque. tkinter fournit toute une serie # de fonction associées à ces boites dans le module 'filedialog'. # La fonction ci dessous renvoie un objet fichier ouvert en écriture: ofi = asksaveasfile(filetypes=[("Texte",".txt"),("Tous","*")]) for clef, valeur in list(self.dico.items()): ofi.write("{0} {1}\n".format(clef, valeur)) ofi.close() def restaure(self): "la fonctionci dessous renvoie un objet fichier ouvert en lecture :" ofi = askopenfile(filetypes=[("Texte","txt"),("Tous","*")]) lignes = ofi.readlines() for li in lignes: cv = li.split() # extraction de la clef de la valeeuer self.dico[cv[0]] = cv[1] ofi.close() if __name__ == '__main__': Application().mainloop()
Hors ligne
Bonjour,
Je pense qu'il y a 2 ou 3 soucis dans le code.
enCode est un paramètre de l'objet de type Application, mais jamais vous n'instanciez cet objet, j'aurais écris à la fin :
X= Application() X.mainloop()
Du coup vous pouvez utiliser X.enCode....
Ensuite dans la définition de enCode, vous mettez :
self.enCode = Entry(frSup,width=25).grid(row=2, column=2)
Donc enCode reçoit ce qui est retourné par grid(...), c'est à dire rien (None). Il faut le faire en 2 lignes :
self.enCode = Entry(frSup,width=25) enCode.grid(row=2, column=2)
Vincent
Hors ligne
Au temps, pour moi, seule la 2ème remarque est pertinente (et règle le problème), je n'avais pas vu que testeCoul était dans Application.
Hors ligne
Merci je vais essayer pour voir.
Hors ligne
Ok, cela fonctionne. Merci encore. Autrement je pensais ajouter un gestionnaire d'évènement comme:
self.enCode.bind("<Return>",testeCoul)
mais je n'ai pas encore essayé.
Hors ligne
Bonjour,
Je pense qu'il y a 2 ou 3 soucis dans le code.
enCode est un paramètre de l'objet de type Application, mais jamais vous n'instanciez cet objet, j'aurais écris à la fin :
X= Application() X.mainloop()Du coup vous pouvez utiliser X.enCode....
Ensuite dans la définition de enCode, vous mettez :
self.enCode = Entry(frSup,width=25).grid(row=2, column=2)Donc enCode reçoit ce qui est retourné par grid(...), c'est à dire rien (None). Il faut le faire en 2 lignes :
self.enCode = Entry(frSup,width=25) enCode.grid(row=2, column=2)
merci beaucoup
Dernière modification par drak15 (2018-12-31 16:27:42)
Hors ligne