Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème variable et actualisation de quiz

Sujet résolu
    26 avril 2015 à 18:14:22

    Bonjour à tous,

    Je réalise actuellement un jeu pour mon projet d'ISN de fin d'année. J'ai pratiquement terminé le jeu que je dois réaliser à l'exception de deux erreurs.

    En effet, pour que mon quiz soit dans une fenêtre à part (car j'ai un menu), je le lance en mettant dans une fonction run. Cependant cela provoque un problème de variable puisque lorsque le joueur clique sur sa réponse, ça bloque les boutons de réponse pour éviter qu'il augmente son score infiniment. Les boutons propositionX (X=1, 2, 3 ou 4) sont donc définis dans la fonction run et quand je lance le quiz, il me dit que propositionX n'est pas défini. J'ai essayé de les mettre en global, mais cela ne règle pas la solution... 

    Le message d'erreur

    Le deuxième problème qui se pose est que, à la recommandation des mes profs, les questions et réponses se trouvent dans un fichier à part. Un première fonction sélectionne au hasard une question puis la supprime de la liste. Je n'arrives pas à trouver la solution pour que ma fenêtre se trouvant dans la fonction run s'actualise pour les questions et réponses sans actualiser toute la fenêtre pour éviter les bugs avec les points ou même que ça me repropose toutes les questions dans la liste. J'ai essayé la fonction update sans succès..

    Je vous joins mon code :

    #!/usr/bin/python
    # -*- coding: utf8 -*-
    
    from tkinter import *
    import random
    import linecache
    
    
    
    
    #########################################
    #       Définition des variables        #
    #########################################
    
    points = 0
    
    
    #########################################
    #       Définition des fonctions        #
    #########################################
    
    def colonnealeatoire():
    
        liste = [1,2,3,4]
    
        global a
        global b
        global c
        global d
           
        a = int(random.choice(liste))
        liste.remove(a)     
    
        b = int(random.choice(liste))
        liste.remove(b)
    
        c = int(random.choice(liste))
        liste.remove(c)
    
        d = int(random.choice(liste))
        liste.remove(d)
    
    	
    def propositions():
    
        global quest
        global prop1
        global prop2
        global prop3
        global prop4
    
        liste = [1,7,13,19,25]
    
        e = int(random.choice(liste))
        liste.remove(e)     
    
        f = e + 1
        g = e + 2
        h = e + 3
        j = e + 4
    
    
      
        quest = linecache.getline('donnees.txt', e)
        prop1 = linecache.getline('donnees.txt', f)
        prop2 = linecache.getline('donnees.txt', g)
        prop3 = linecache.getline('donnees.txt', h)
        prop4 = linecache.getline('donnees.txt', j)    
    
        
    def bonnereponse() : 
       
       global points
       
       text = "Bravo, tu as trouvé la bonne réponse !"
       #info.config(text=texte)
       points = points+1
    
       proposition1.config(state=DISABLED)
       proposition2.config(state=DISABLED)
       proposition3.config(state=DISABLED)
       proposition4.config(state=DISABLED)
    	
    
    def mauvaisereponse() :
    
        global points
    
        text = "Malheureusement, ce n'est pas la bonne réponse ..."
        #info.config(text=texte)
        
        points = points
    
        proposition1.config(state=DISABLED)
        proposition2.config(state=DISABLED)
        proposition3.config(state=DISABLED)
        proposition4.config(state=DISABLED)
    	
    
    def nombrepoints():
    
        print ("Tu as obtenu",points,"bonne(s)réponse(s)")
    
    def questionsuivante():
        proposition.update
        question.update
        proposition1.update
        proposition2.update
        proposition3.update
        proposition4.update
    
    def questionsuivante():
        
        
    
    ########################### 
    #           Quiz          #
    ###########################
    
    def run():
        
        colonnealeatoire()
    
        propositions()
    
        #Création et configuration (titre et couleur) de la fenetre
        quiz = Tk()
        quiz.configure(bg="#9C3B3B")
        quiz.title("QUESTION POUR UN JUNIOR")
    
        #Titre
        titre=Label(quiz, text="", font="tahoma 16", bg="#9C3B3B", fg="white", underline= 0)
        titre.grid(row=2)
    
        #Question
        question=Label(quiz, text="", font="tahoma 14", bg="#9C3B3B", fg="black")
        question.grid(row=2)
        question.config(text=quest)
    
        #Propositions de réponse
        proposition1=Button(quiz,text="",font="tahoma 12",bg="#3B9C9C", fg="white", command=bonnereponse)
        proposition1.grid(row=3, column=a)
        proposition1.config(text=prop1)
    
        proposition2=Button(quiz,text="",font="tahoma 12",bg="#3B9C9C", fg="white",command=mauvaisereponse)
        proposition2.grid(row=3,column=b)
        proposition2.config(text=prop2)
    
        proposition3=Button(quiz,text="",font="tahoma 12",bg="#3B9C9C", fg="white", command=mauvaisereponse)
        proposition3.grid(row=3,column=c)
        proposition3.config(text=prop3)
    
    
        proposition4=Button(quiz,text="",font="tahoma 12",bg="#3B9C9C", fg="white", command=mauvaisereponse)
        proposition4.grid(row=3,column=d)
        proposition4.config(text=prop4)
    
    
        #Configuaration du champ d'affichage du résultat
        info=Label(quiz,text=" ",font="tahoma 14")
        info.grid(row=4, columnspan=6, sticky=W+E)
    
        #Question suivante
        suivant=Button(quiz,text=" Question suivante >> ",font="tahoma 12",bg="#3B9C9C", fg="white", command=questionsuivante)
        suivant.grid(row=5)
    
    
    
        quiz.mainloop()

    Merci énormément d'avance, car ça fait plusieurs jours que je bloque..

    Théo.

    • Partager sur Facebook
    • Partager sur Twitter
    "L'urgent est fait; l'impossible est en cours; pour les miracles, prévoir un délai."
      27 avril 2015 à 8:37:02

      Bonjour,

      De ce que j'ai pu voir j'ai plusieurs questions qui me viennent en tête :

      1) En lisant bien ta fonction run, ce sera toujours ton bouton1 qui contiendra la bonne réponse, vu que c'est le seul à appeler la méthode bonnereponse ?

      2) Tu as deux méthodes questionsuivante qui sont définies, est-ce normal ?

      3) Plutôt que de passer par des variables globales je te conseillerai de passer par un Objet, créer une classe question comprenant la liste de question avec leurs réponses associées, ça te faciliterai la vie je pense.

      4) Ta fonction colonnealeatoire sert à quoi ? Définir 4 questions aléatoirement dans la liste ?

      • Partager sur Facebook
      • Partager sur Twitter
        27 avril 2015 à 21:34:15

        Bonjour,

        1) Oui, la bonne réponse est toujours contenue dans le bouton 1. Je t'explique, ce qui va répondre également à ta question 4). La colonne aléatoire provoque une disposition aléatoire des boutons. Donc la bonne réponse sera toujours au bouton 1 mais lui même sera disposé aléatoirement sur 4 colonnes.

        2) Non, c'est pas réellement normal. En fait, c'est lors de mes derniers essais, j'ai pas fait attention et j'ai rajouté une fonction une deuxième fois. Mais c'est la même fonction en réalité.

        3) Pour ce que ce passe des classes et des objets, nos professeurs nous ont totalement déconseillé de nous y engager car on ne comprendrait pas et ne maîtriserait pas et ça nous portera réellement préjudice lors de l'oral...

        4) voir question 1

        • Partager sur Facebook
        • Partager sur Twitter
        "L'urgent est fait; l'impossible est en cours; pour les miracles, prévoir un délai."
          28 avril 2015 à 8:27:28

          Comment peuvent-ils savoir que vous n'allez pas comprendre la POO sans même vous l'expliquer ?... Dans ce cas ci, je pense alors qu'il faut que tu supprimes ta méthode run, et que tout ce qui est dedans soit dans le main. Le problème de variable ici est effectivement dû au fait que tes variables proposition ne sont pas globales. Le soucis est que, lorsque j'ai commencé à coder en Python, dès que j'ai eu un soucis de ce style, je me suis tourné vers la programmation orienté objet, car je comprenais mieux comment cela fonctionne que les variables globales en Python, que j'ai d'ailleurs toujours un peu de mal à saisir.. Je te conseille quand même de jeter un coup d'oeil à la POO voir si tu comprends ou pas, sans bien entendu t'obliger à changer tout ton code.

          En supprimant chez moi la fonction run et en mettant toutes ses actions dans le main, le programme arrive à se lancer, mais je tombe sur un erreur de variable dans la méthode questionsuivante, dû au fait que propositions n'existe pas. 

          • Partager sur Facebook
          • Partager sur Twitter
            28 avril 2015 à 8:33:19

            Du coup pour le moment, dans ta méthode questionsuivante, j'ai viré la ligne propositions.update, et j'ai ajouté ceci :

            def questionsuivante():
                #propositions.update
                question.update
                proposition1.update
                proposition2.update
                proposition3.update
                proposition4.update
                proposition1.config(state="normal")
                proposition2.config(state="normal")
                proposition3.config(state="normal")
                proposition4.config(state="normal")

            Ca permet de remettre tes boutons fonctionnels une fois passé à la question suivante, ce qui n'était pas le cas avant

            • Partager sur Facebook
            • Partager sur Twitter
              29 avril 2015 à 19:24:18

              D'accord. Merci beaucoup!

              Est-ce que vous avez une partie spécifique à me conseiller en POO où faut-il que je m’intéresse à la totalité ?

              • Partager sur Facebook
              • Partager sur Twitter
              "L'urgent est fait; l'impossible est en cours; pour les miracles, prévoir un délai."
                30 avril 2015 à 8:43:18

                Ah c'est un tout, intéresse toi déjà à voir comment ça fonctionne, l'idée qui est derrière, et après pourquoi voir comment tu pourrais l'appliquer à ton code ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  17 mai 2015 à 11:38:05

                  Bonjour,

                  Pour ceux que ça intéresse, j'ai trouvé une autre solution qui m'a évité d'utiliser la POO. Bien sûr c'est une situation qui ne manquera pas d'évoluer quand l'épreuve sera passé et que je ne serai plus soumis aux contraintes du bac..

                  J'ai simplement créé une fonction qui détruit la fenêtre de mon quiz avec la méthode destroy() : ici quiz.destroy puis j'ai relancé la fonction run dans laquelle se trouve ma fenêtre : run().

                  C'est aussi simple que ça!

                  Merci robinturonlagot pour ton aide. Je vais approfondir tous tes conseils dans la suite de mon travail libre.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  "L'urgent est fait; l'impossible est en cours; pour les miracles, prévoir un délai."

                  Problème variable et actualisation de quiz

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown