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

Python Discussion :

Problème d'enregistrement avec python


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème d'enregistrement avec python
    Bonjour, je travaille sur python pour un projet scolaire et, étant débutante, je ne sais pas comment me débloquer.
    Je m'explique, je dois créer une page d'accueil qui ouvre sur deux jeux. Une fois le jeu choisi, l'utilisateur doit choisir son nom dans une liste (j'utilise listbox) et, si son nom n'y est pas, il doit entrer son nom dans une barre de texte et, en cliquant sur entrée, son nom sera automatiquement ajouté à la listbox. J'ai essayé d'utiliser stringvar mais je n'arrive pas récupérer le nom entré dans la barre de texte. Avez-vous des idées ?

    Parallèlement à ça, je dois enregistrer les utilisateurs et les scores sur un fichier texte. J'avais pensé utiliser le dictionnaire mais, d'après mes recherches, il faut utiliser pickle ou json. Mon professeur n'étant pas trop d'accord, est-il possible de faire sans ? Est-ce qu'enregistrer les utilisateurs et les meilleurs scores sans passer par le dictionnaire pourrait être possible ?

    Je vous mets mon programme, n'hésitez pas à me dire si il y a des soucis ou incohérences !

    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
    import tkinter as tk
     
    #nom du dictionnaire qui enregistrera les futurs meilleurs scores
    meilleur_score = { "Axelle": 4, "Manon": 3 }
    #pour modifier le texte dans le fichier : meilleurscore.write(texte à rentrer)
     
     
    #ouverture du fichier dans lequel sont engeristrés les utilisateurs et leur meilleur score
    meilleurscore= open('fichierordi1', 'a')
     
    def ajout_utilisateur_listbox():
        page_listbox=tk.Tk()
        page_listbox.geometry("400x200")
        Lb_utilisateurs= tk.Listbox(page_listbox)
        Lb_utilisateurs.pack()
            #longueur= Lb_utilisateurs.size()
        page_listbox.mainloop()
        page_listbox=tk.Toplevel()
     
    #définition de la 1ère page, qui ouvre le jeu "Apprendre"
    def page1():
     
        fenetre1=tk.Tk()
        fenetre1.title("Apprendre")
    #couleur de fenêtre
        fenetre1.config(bg = "#E6E0F8")
    #taille de fenetre
        fenetre1.geometry("1200x900")
        # Message de bienvenue
        message1 = tk.Label(fenetre1, text = "Bienvenue dans l'oreille absolue")
        message1.config(font = ('Times', 30, 'bold italic'), fg = 'black', bg= "#E6E0F8")
        message1.pack(pady=10)
     
    #règles du jeu A modifier
        message2 = tk.Label(fenetre1, text = "Règles du jeu")
        message2.config(font = ('Times', 30, 'bold italic'), fg = 'black', bg= "#E6E0F8")
        message2.pack(pady=10)
     
        bouton6 = tk.Button (fenetre1, text = "retour", width = 20, height = 3,command=lambda:fenetre1.destroy())
        bouton6.pack()
        bouton6.place(x=455,y=450)
     
        bouton_ancienutilisateur= tk.Button(fenetre1, text= "J'ai déja joué !", width = 20, height = 3)
        bouton_ancienutilisateur.pack()
        bouton_ancienutilisateur.place(x=455, y=330)
    #A partir d'ici, on crée un label qui permet de rentrer son nom en tant qu'utilisateur
     
        #ici, on définit le nom de l'utilisateur en tant que variable
        nouvelutilisateur= tk.StringVar()
     
        #création d'un label qui permet d'écrire son nom
        labeldutexte= tk.Label(fenetre1, text="Entrez votre nom: ")
        labeldutexte.pack()
     
        nom_utilisateur= tk.Entry(fenetre1, textvariable=nouvelutilisateur)
        nom_utilisateur.focus_set()
        nom_utilisateur=nom_d_utilisateur.get
        nom_utilisateur.pack()
     
     
     
        #création du bouton "entrer", très important, qui permet de valider le texte
        bouton_entrer = tk.Button(fenetre1, text= "Entrer", width = 20, height = 3)
        bouton_entrer.place(x=500, y=200)
        bouton_entrer.pack()     
        bouton_nouvelutilisateur= tk.Button(fenetre1, text="Nouvel utilisateur", width = 20, height = 3)
        bouton_nouvelutilisateur.pack()
        bouton_nouvelutilisateur.place(x=455, y=400)
     
     
    #définition de la 2ème page, qui ouvre le jeu "Se tester"    
    def page2():
        fenetre2=tk.Tk()
        # En utilisant l’instruction « from tkinter import * », on peut appeler les éléments du module directement.
        fenetre2.title("Se tester")
     
    #couleur de fenêtre
        fenetre2.config(bg = "#E6E0F8")
    #taille de fenetre
        fenetre2.geometry("1200x900")
     
    # Message de bienvenue
        message3 = tk.Label(fenetre2, text = "Bienvenue dans l'oreille absolue !")
        message3.config(font = ('Times', 30, 'bold italic'), fg = 'black', bg= "#E6E0F8")
        message3.pack(pady=10)
     
    #règles du jeu A modifier
        message4 = tk.Label(fenetre2, text = "Règles du jeu")
        message4.config(font = ('Times', 30, 'bold italic'), fg = 'black', bg= "#E6E0F8")
        message4.pack(pady=10)
     
        bouton7 = tk.Button (fenetre2, text = "retour", width = 20, height = 3,command=lambda:fenetre2.destroy())
        bouton7.pack()
        bouton7.place(x=455,y=330)
     
    # Création d'une fenêtre principale avec Tk :
    fenetre=tk.Tk()
     
    # Titre de la fenêtre
    fenetre.title("Jeu avec Ax")
     
    #couleur de fenêtre
    fenetre.config(bg = "#E6E0F8")
     
    #taille de fenetre
    fenetre.geometry("1200x900")
     
    # Ajout d'un bouton dans la fenêtre pour commencer une nouvelle partie (en tant que nouvel utilisateur):
    bouton3 = tk.Button (fenetre, text = "Apprendre", width = 20, height = 3,command=lambda:[page1(), ajout_utilisateur_listbox()])
    bouton3.pack()
    bouton3.place(x=455,y=250)
     
    #Ajout d'un bouton pour reprendre une ancienne partie 
    bouton4 = tk.Button (fenetre, text = "Se tester", width = 20, height = 3,command=lambda:page2())
    bouton4.pack()
    bouton4.place(x=455,y=330)
     
    def processQuit():
        fenetre.destroy()
     
     
    bouton5= tk.Button(fenetre, text = 'Quitter', width = 20, height = 3, command=processQuit)
    bouton5.pack()
    bouton5.place(x=455,y=410)
     
    # Affichage de la fenêtre créée :
    fenetre.mainloop()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    Citation Envoyé par re4236 Voir le message
    J'ai essayé d'utiliser stringvar mais je n'arrive pas récupérer le nom entré dans la barre de texte. Avez-vous des idées ?
    Si votre code est "mal écrit", il ne va pas marcher.

    Déjà, vous devriez éviter (parce que çà va être difficile à mettre au point sinon) d'avoir plusieurs appels à Tk(). Le premier est la fenêtre principale, les autres doivent être des Toplevel().

    Pour le reste, si la saisie du nom utilisateur ne fonctionne pas, réduisez le code aux instructions qui ne font que çà et essayez de comprendre ce qui ne marche pas: vous allez avoir des messages d'erreurs, des comportements bizarres,...

    Prenez le temps d'ouvrir un tuto. sur tkinter: on dirait que vous n'avez pas beaucoup pratiqué, mais çà ne ressemble pas du tout à çà.

    Citation Envoyé par re4236 Voir le message
    J'avais pensé utiliser le dictionnaire mais, d'après mes recherches, il faut utiliser pickle ou json. Mon professeur n'étant pas trop d'accord, est-il possible de faire sans ?
    Un fichier c'est éventuellement des lignes et des colonnes. Et un dictionnaire de scores ce sera des noms (clefs) associé à un score (valeur). On peut en faire un fichier où chaque clef, valeur sera écrit dans une ligne. Donc c'est possible.

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

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par re4236 Voir le message
    J'avais pensé utiliser le dictionnaire mais, d'après mes recherches, il faut utiliser pickle ou json. Mon professeur n'étant pas trop d'accord, est-il possible de faire sans ? Est-ce qu'enregistrer les utilisateurs et les meilleurs scores sans passer par le dictionnaire pourrait être possible ?
    Les outils ne sont pas des ingrédients de potion magique qu'on jette dans la marmite et qu'on mélange ensuite pour qu'ils s'assemblent tout seuls. Ce ne sont que des "outils" qui ont un simple rôle. Le rôle de pickle est de "dumper" un objet Python (généralement liste, tuple, dictionnaire) dans une suite ascii qu'on pourra alors enregistrer sur un support physique (ex un fichier). Ce support pourra alors être envoyé à un autre programme Python (ou alors au même programme Python mais exécuté plus tard) qui pourra le récupérer avec tout son contenu. L'avantage immédiat c'est que c'est Python (enfin pickle) qui se charge de dumper/récupérer. L'inconvénient c'est que la suite de lettres est incompréhensible pour un humain (ce qui n'est pas forcément rédhibitoire, après-tout, un "mp3" aussi est incompréhensible pour un humain ce qui ne l'empêche pas de fonctionner dans un lecteur). Toutefois peut-être que ton prof veut un fichier score qui soit "human readable" et donc là pickle ne pourra pas convenir.
    Un json lui sert à exprimer une structure hiérarchique à plusieurs niveaux (style bdd) dans un fichier. Là on a bien un fichier lisible (voire modifiable) par un bloc note mais il est principalement fait pour des structures plus complexes qu'une simple ligne contenant "joueur1:nom toto, score 18". Enfin oui, de façon absolue un marteau pilon peut aussi écraser des moustiques.

    Donc oui chacun de ces modules pourra convenir. De même tu pourras aussi installer un serveur bdd et y entrer les scores sous forme de table à base de requête SQL. Mais ce sera à toi de les utiliser correctement.
    Maintenant vu la simplicité (enfin que j'imagine) de ton score par rapport à la complexité de ces outils, alors effectivement il est possible de faire sans et de créer alors ton propre formalisme (ex joueur:toto:18) puis d'écrire toi-même ce format dans un fichier texte pour ensuite le relire de la même façon.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    J'aime bien la réponse de Sve@r, je veux juste y ajouter des illustrations par l'exemple.
    Si on part d'un dictionnaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> D = { 'toto': 3, 'tutu':4 }
    l'écrire dans un fichier, c'est en faire une chaine de caractères bien structurée pour le reconstruire lorsqu'on va relire le fichier.
    JSON, Pickle, str,... sont des méthodes pour transformer un dictionnaire (et bien plus) en chaine de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> import pickle
    >>> pickle.dumps(D)
    b'\x80\x04\x95\x17\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04toto\x94K\x03\x8c\x0
    4tutu\x94K\x04u.'
    >>> import json
    >>> json.dumps(D)
    '{"toto": 3, "tutu": 4}'
    >>> print(str(D))
    {'toto': 3, 'tutu': 4}
    "méthodes" d'autant plus intéressantes qu'on a les fonctions inverses.

    Ce que veut (peut être, car je ne suis pas dans sa tête) votre professeur est que vous mettiez en place votre propre méthode pour voir comment on peut s'en dépatouiller et vous donnez l'occasion de toucher du doigts fichiers, structures de données,... ce qui sera plus "formateur" que d'utiliser des outils prêts à l'emploi.

    Mais c'est un détail de ce que vous êtes en train de coder: vous pouvez très bien utiliser JSON pour l'instant et continuer à coder votre jeu pour revoir cela par la suite.

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

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Effectivement j'ai des soucis avec les fenêtres qui ne s'ouvrent pas bien, je vais me renseigner pour le toplevel(), je n'avais pas bien compris comment l'utiliser visiblement.
    Pour ce qui est du tuto, j'aurai effectivement du commencer par là car j'avais quelques petites erreurs detectées, et en prenant petit bout par petit bout j'ai pu tout résoudre !

    Merci beaucoup pour ces précieux conseils !

    Citation Envoyé par Sve@r Voir le message
    L'enregistrement des scores est en effet très simple,jai suivi vos conseils et essayé de faire sans et je pense avoir réussi ! Je retiens tout de même la subtilité entre pickle et json qui me semblaient être le même outil.

    Merci de votre aide !

Discussions similaires

  1. Problème d' OVERFLOW avec python
    Par LabChNe dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 05/11/2010, 14h34
  2. Problème d'enregistrement avec le composant Virtual Treeview
    Par Faith's Fall dans le forum C++Builder
    Réponses: 8
    Dernier message: 19/05/2008, 12h52
  3. Problème d'encodage avec Python
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 22/02/2006, 14h36
  4. probléme d'enregistrement avec les chexkbox.
    Par pmboutteau dans le forum ASP
    Réponses: 16
    Dernier message: 18/10/2005, 15h05

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