Forum EduPython

Echanges autour d'EduPython.

Vous n'êtes pas identifié(e).

#1 2018-02-03 13:40:56

pierre
Membre
Inscription : 2017-12-29
Messages : 12

Dictionnaire de couleur issue de G Swinnen

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

#2 2018-02-05 15:48:57

magicvinni
Administrateur
Inscription : 2017-12-22
Messages : 308

Re : Dictionnaire de couleur issue de G Swinnen

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

#3 2018-02-05 16:05:01

magicvinni
Administrateur
Inscription : 2017-12-22
Messages : 308

Re : Dictionnaire de couleur issue de G Swinnen

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

#4 2018-02-06 10:10:41

pierre
Membre
Inscription : 2017-12-29
Messages : 12

Re : Dictionnaire de couleur issue de G Swinnen

Merci je vais essayer pour voir.

Hors ligne

#5 2018-02-06 13:45:31

pierre
Membre
Inscription : 2017-12-29
Messages : 12

Re : Dictionnaire de couleur issue de G Swinnen

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

#6 2018-12-30 20:17:05

drak15
Membre
Inscription : 2018-12-30
Messages : 2

Re : Dictionnaire de couleur issue de G Swinnen

magicvinni a écrit :

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) 

Subway Surfers Psiphon Hill Climb Racing
Vincent

merci beaucoup

Dernière modification par drak15 (2018-12-31 16:27:42)

Hors ligne

Pied de page des forums