IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Exercice case Entry [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut Exercice case Entry
    Bonjour,

    Je viens tous les jours en ce moment, désolée
    tkinter c'est vraiment pas ma tasse de thé (surtout que je préfère le chocolat )

    J'ai donc un problème de cas Entry, je voudrai "seulement" afficher dedans le code de la couleur, qui a été préalablement ajouté à un dictionnaire.

    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
    # exo 13.22 : élaboration d'un dictionnaire de couleurs, qui sera une applica-
    # tion graphique, avec un certain nombre de champs d'entrée et de boutons.
    #
    #
    from tkinter import *
     
    class Dictio_Couleurs(Frame) :
        """Afin d'instancier un dictionnaire contenant les codes hexadécimaux de
    quelques couleurs, et le mot français correspondant"""
        def __init__(self) :
            Frame.__init__(self)
            self.dicou = {}
     
            Button(self,text='Ajouter',width=15,command=self.ajouter).grid(row=0,column=1)
            Button(self,text='Interroger',width=15,command=self.afficher).grid(row=1,column=1)
            Button(self,text='Enregistrement',width=15,command=self.enregistrer).grid(row=2,column=1)
            Button(self,text='Chargement',width=15,command=self.reconstruire).grid(row=3,column=1)
            Button(self,text='Quitter',width=15,command=self.quit).grid(row=4,column=1)
     
            self.case_nom = Entry(self,width=25)
            self.case_nom.grid(row=1,column=0)
            self.case_nom.bind('<Return>',self.afficher)
            Label(self,text='Nom de la couleur :').grid(row=0,column=0)
     
            self.var_aff = ''
     
            self.case_code = Entry(self,width=25,textvariable=self.var_aff)
            self.case_code.grid(row=3,column=0)
            Label(self,text='Code hexadécimal de la couleur :').grid(row=2,column=0)
            self.pack()
     
     
        def ajouter(self) :
            if self.case_nom != '' and self.case_code != '' :
                self.dicou[self.case_nom.get()] = self.case_code.get()
     
        def afficher(self) :
            if self.case_nom != '' and self.case_nom.get() in self.dicou :
                self.var_aff(eval(str(self.dicou[self.case_nom.get()]))) 
                print(self.dicou[self.case_nom.get()])
     
        def enregistrer(self) :
            fichier = open('French couleurs','w')
            for nom,couleur in self.dicou.items() :
                fichier.write("{}&{}\n".format(nom,couleur))
     
            fichier.close()
     
     
        def reconstruire(self) :
            fichier = open('French couleurs','r')
            while 1 :
                ch = fichier.readline()
                if ch == '' :
                    break
                else :
                    nom = ch[:ch.index('&')]
                    code = ch[ch.index('&')+1:ch.index('\n')]
                    self.dicou[nom] = code
            fichier.close()
     
     
     
    if __name__ == "__main__" :
        g = Dictio_Couleurs()
        g.mainloop()
        g.destroy()
    Voilà, donc tous mes boutons (et donc les déf qui sont liées) fonctionnent, sauf afficher.
    (je sais, pour reconstruire il y avait beaucoup plus simple....peu importe pour l'instant, ça marche)
    je n'arrive pas à afficher le code couleur dans la case entry, et je ne sais pas comment m'y prendre.
    Là j'ai donc créé une variable, que j'ai mis en textvariable dans la case Entry, et dans la fonction afficher......set ne fonctionnait pas (vu que c'est du string), donc j'ai mis un eval.
    Bref, ça ne fonctionne pas.
    self.var_aff(eval(str(self.dicou[self.case_nom.get()])))
    File "<string>", line 1
    #606060
    ^
    SyntaxError: unexpected EOF while parsing


    Et c'est vraiment juste l'affichage dans la case, parce que le code que je recherchais c'était bien #606060.
    S'il pouvait me le mettre dans la case, au lieu de me l'afficher dans l'erreur

  2. #2
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    C'est bon je l'ai trouvé

    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
    self.var_aff = StringVar()
     
            self.case_code = Entry(self,width=25,textvariable=self.var_aff)
            self.case_code.grid(row=3,column=0)
            Label(self,text='Code hexadécimal de la couleur :').grid(row=2,column=0)
            self.pack()
     
     
        def ajouter(self) :
            if self.case_nom != '' and self.case_code != '' :
                self.dicou[self.case_nom.get()] = self.case_code.get()
     
        def afficher(self) :
            if self.case_nom != '' and self.case_nom.get() in self.dicou :
                self.var_aff.set(str(self.dicou[self.case_nom.get()]))
    Déjà fallait précisé StringVar() pour ma variable, et c'était bien .set.
    Bref, c'est un peu le hasard, j'ai trouvé en tâtonnant mais bon...ça fonctionne, il m'affiche bien le code dans la case
    Maintenant, je vais travailler un peu tout ça pour améliorer, parce que c'est pas très beau, ni très utile en l'état

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    Là j'ai donc créé une variable, que j'ai mis en textvariable dans la case Entry, et dans la fonction afficher......set ne fonctionnait pas (vu que c'est du string), donc j'ai mis un eval.
    Le textvariable d'une Entry doit être un StringVar ou autre Variable tkinter et non une chaine de caractères.
    Et que ce soit une Variable tkinter ou une chaine de caractères, ce ne sont pas des fonctions, donc écrire self.var_aff(...) va planter.

    Citation Envoyé par RowanMayfair Voir le message
    peu importe pour l'instant, ça marche)
    Ce n'est pas parce que Python ne râle pas qu'il saura faire quelque chose de vos instructions le jour où il ne plantera plus avant même de les avoir exécutées...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    (...)

    Ce n'est pas parce que Python ne râle pas qu'il saura faire quelque chose de vos instructions le jour où il ne plantera plus avant même de les avoir exécutées...

    - W
    ma fonction "reconstruire" fonctionne correctement (edit : en tout cas elle fait ce que j'attendais d'elle). Je l'ai testée plein de fois.
    Simplement, je me suis embêtée avec du slicing sur de la recherche d'index.....c'est un peu lourd, si je reprends je trouverai certainement plus simple.
    (j'avoue, après le longues journée passées à essayer de comprendre le fonctionnement de tkinter, j'étais en manque de slicing, et de dictionnaire, etc...)

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    ma fonction "reconstruire" fonctionne correctement (edit : en tout cas elle fait ce que j'attendais d'elle). Je l'ai testée plein de fois.
    J'en suis ravi pour vous mais quel est le rapport entre cette fonction là et le sujet?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    aucun rapport en fait.
    Désolée.

  7. #7
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Il me restait un petit problème en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    self.case_nom = Entry(self,width=25)
            self.case_nom.grid(row=1,column=0)
            self.case_nom.bind('<Return>',self.afficher)
            Label(self,text='Nom de la couleur :').grid(row=0,column=0)
    Là Python me revoie un TypeError :
    return self.func(*args)
    TypeError: afficher() takes 1 positional argument but 2 were given

    c'est la même fonction que j'utilise pour mon bouton "Afficher".
    C'est pour ça ? Ou il y a une autre raisons ?

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    C'est pour ça ? Ou il y a une autre raisons ?
    La fonction passée comme command=... à un Button ou la fonction passée à .bind seront appelées par tkinter lorsque... et les paramètres que devront accepter ces fonctions sera fonction de l'opération et précisé dans la documentation de tkinter.
    Et si vous n'y trouvez rien, vous avez dans le tuto. des exemples d'utilisation qui devraient...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Opérations sur les cases Entry
    Par RowanMayfair dans le forum Tkinter
    Réponses: 3
    Dernier message: 18/04/2019, 11h08
  2. Exercice d'UML use case class
    Par ridazero dans le forum UML
    Réponses: 1
    Dernier message: 23/05/2013, 21h55
  3. Exercice case accessibles
    Par crow56 dans le forum Débuter
    Réponses: 7
    Dernier message: 25/06/2008, 19h45
  4. Message 'Duplicate index entry'
    Par Poulou dans le forum Administration
    Réponses: 13
    Dernier message: 04/05/2004, 14h57
  5. Pouvez vous m'aider a resoudres ces 3 exercices
    Par algorithmique dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 09/08/2002, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo