Problème suppression information dico

Résolu/Fermé
worox Messages postés 23 Date d'inscription mercredi 13 avril 2022 Statut Membre Dernière intervention 1 septembre 2022 - Modifié le 12 août 2022 à 13:26
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 - 16 août 2022 à 14:02

Bonjour,

J'ai un problème avec un dictionnaire. Quand j'ajoute plusieurs informations, l'information précédente est supprimée.

Mon but est de faire un répertoire des inscrits.

Voilà le code :

import tkinter

app = tkinter.Tk()

app.geometry("250x395")
app.title("QuizCool")

""" 
variable diverse
"""
n_b_inscript = 0

"""
disctionnaire divers
"""
personne = {
    "pseudo" : {

    },
    "prénom" : {

    },
    "nom" : {

    },
    "mot de passe" : {

    },
    "objectif" : {

    }
}
"""
fonction diverse
"""


def quitter():
    app.quit()


def set_profil(defpseudo, defprenom, defnom, defobjetctif, defpass):
    global n_b_inscript
    personne["pseudo"] = defpseudo
    print(defpseudo)
    personne["nom"] = defnom
    print(defnom)
    personne["prénom"] = defprenom
    print(defprenom)
    personne["objectif"] = defobjetctif
    print(defobjetctif)
    personne["mot de passe"] = defpass
    print(defpass)
    print(personne)
    n_b_inscript += 1
    print(f"il y a {n_b_inscript} personnes inscites")

def get_info_profil():
    nom = Entry_nom.get()
    prenom = Entry_prenom.get()
    pseudo = Entry_pseudo.get()
    mot_de_passe = Entry_pass.get()
    set_profil(pseudo, prenom, nom, 1, mot_de_passe)

def pers():
    print(personne)



# -----------------section d'inscirption-----------------
label_bv = tkinter.Label(app, text="bienvenue sur QuizCool", bg="green", height=2, width=10)

Frame_size = tkinter.LabelFrame(app, text="Zone d'inscription", border=5)
Label_entry_nom = tkinter.Label(Frame_size, text="Nom")
Entry_nom = tkinter.Entry(Frame_size)
Label_entry_prenom = tkinter.Label(Frame_size, text="prenom")
Entry_prenom = tkinter.Entry(Frame_size)
Label_entry_pseudo = tkinter.Label(Frame_size, text="Pseudo")

Entry_pseudo = tkinter.Entry(Frame_size)
Label_entry_pass = tkinter.Label(Frame_size, text="Mot de passe")

Entry_pass = tkinter.Entry(Frame_size)
buton_confirm_pass = tkinter.Button(Frame_size, text="Confirmer", command=get_info_profil)
buton_quitter = tkinter.Button(app, text="quitter", bg="green", height=1, width=5, command=quitter)

Label_Radio = tkinter.Label(Frame_size, text="Sélectionne l'une des cases suivantes.\n"
                                             "Ces sélections ont pour but de présenter\n"
                                             "tes objectifs sur la plateforme.")
Radio_2 = tkinter.Radiobutton(Frame_size, text="Consommateur", value=0)
Radio_1 = tkinter.Radiobutton(Frame_size, text="Créateur", value=1)
Radio_3 = tkinter.Radiobutton(Frame_size, text="Créateur et consommateur", value=2)

buton_inscri = tkinter.Button(Frame_size, text="click", command=pers)
# -----------------deuxième section-----------------

# -----------------section d'inscirption-----------------
label_bv.pack(side="top", fill='x')

Frame_size.pack(fill="x")
Label_entry_nom.pack()
Entry_nom.pack()
Label_entry_prenom.pack()
Entry_prenom.pack()
Label_entry_pseudo.pack()
Entry_pseudo.pack()
Label_entry_pass.pack()
Entry_pass.pack()
Label_Radio.pack()
Radio_2.pack()
Radio_1.pack()
Radio_3.pack()

buton_confirm_pass.pack()
buton_inscri.pack()
buton_quitter.pack(side="bottom", fill='x')
# -----------------deuxième section-----------------

app.mainloop()
  • Le dictionnaire (personne) est déclaré ligne 16,
  • La fonction en charge d'ajouter des informations dans le dictionnaire est déclarée ligne 42 (set_profil),
  • La fonction get_info_profil est déclarée ligne 58 et passe les arguments à set_profil.

Merci d'avance
 

A voir également:

2 réponses

Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
12 août 2022 à 10:03

Bonjour 

Dans un dictionnaire les clés sont uniques 

Donc à chaque personne on écrase la précédente 

1
worox Messages postés 23 Date d'inscription mercredi 13 avril 2022 Statut Membre Dernière intervention 1 septembre 2022 9
12 août 2022 à 12:44

Donc l'idée serait de créer une liste pour chaque caractére ?

0
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
12 août 2022 à 13:37

Bonjour,

Plusieurs choses :

  • Quand tu rédiges un message, veille à soigner l'orthographe, à ne pas utiliser d'abréviations et à faire des phrases complètes (j'ai réécrit ton message #1).
  • Quand tu as un problème, donne un bout de code minimal qui met ton problème en évidence.

Comme Phil l'indique, pour une clé donnée du dictionnaire personne, la fonction set_profil telle que tu l'as écrite écrase les informations précédentes (s'il y en avait).

Pour moi les problèmes sont multiples :

  • Plutôt que d'utiliser un dictionnaire de dictionnaire, tu devrais utiliser :
    • soit une liste de dictionnaire (chaque dictionnaire correspond à une personne)
    • soit un dictionnaire de dictionnaire (le dictionnaire principal a pour clé l'identifiant de la personne et lui associe en donnée le dictionnaire contenant les détails de son profil) ; dans ce cas, la clé peut être construire à la volée à partir d'un ou plusieurs attributs du profil à ajouter/modifier (généralement, le login).
  • Quelle que soit la structure retenue, tu pourrais alors obtenir directement le nombre d'inscrits avec len(personnes), ce qui t'éviterait d'avoir recours à une variable globale (qui n'est jamais une bonne idée).

Exemple :

personnes = dict()

def ajouter(personnes, personne):
    pseudo = personne["pseudo"]
    if pseudo in personnes.keys():
        print("pseudo déjà utilisé!")
    else:
        personnes[pseudo] = personne

def modifier(personnes, personne):
    pseudo = personne["pseudo"]
    if pseudo not in personnes.keys():
        print("pseudo inconnu!")
    else:
        personnes[pseudo] = personne

def get_num_inscrits(personnes):
    return len(personnes)

p1 = {
  "pseudo" : "toto", 
  # ...
}

p2 = {
  "pseudo" : "tata", 
  # ...
}

ajouter(personnes, p1)
ajouter(personnes, p2)
print(get_num_inscrits(personnes))

Bonne chance

1
worox Messages postés 23 Date d'inscription mercredi 13 avril 2022 Statut Membre Dernière intervention 1 septembre 2022 9
13 août 2022 à 10:53

Merci beaucoup de ton message et de tes idées.

0
Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931
13 août 2022 à 11:13

Bonjour,

une liste de classe ne serait elle pas un peu plus simple à utiliser?

0
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749 > Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024
16 août 2022 à 14:02

Tu peux passer par une classe dédiée plutôt qu'utiliser des dictionnaires, mais ça ne change pas grand chose par rapport à une liste de dictionnaires.

0