QCM avec tkinter

man0n -  
davs63 Messages postés 8 Statut Membre -
Bonjour tout le monde !
Alors voila j'ai un projet d'informatique a faire pour le bac car je suis en specialité informatique seulement j'ai quelques petits soucis que mon prof ne peut resoudre c'est pourquoi je suis ici :)
alors je souhaite faire un QCM avec une interface graphique sur Tkinter. je joinds le programme qui me pose probleme dont le probleme est justement "Q str(k)" que l'on retrouve plusieurs fois tout au long du programme.
Si vous pouvz resoudre ce probleme je pourrai continuer a avanccer sur mon projet merci d'avance ! :)
from Tkinter import* 
Fen1=Tk()
Fen1.title(u"Projet Final")
Af1=Label(Fen1, text= u"Bonjour, vous allez maintenant pouvoir commencer le jeu de Manon et Zoémie. Etes-vous prêt ?") #Présentation
Af2=Label(Fen1, text="") #Enoncé
Af3=Label(Fen1, text="") #Rép1
Af4=Label(Fen1, text="") #Rép2
Af5=Label(Fen1, text="") #Rép3
Af6=Label(Fen1, text="Quelle est votre réponse ?")
Af7=Label(Fen1, text="") # On l'utilisisera pour dire bonne ou mauvaise réponse.
Ent1=Entry(Fen1) #Le joueur y rentrera sa réponse
n=0 #Compteur du nombre de click sur le bout1
k=1 #Compteur des questions
def ma_commande1():
global n
global k
n=n+1 # Le compteur de click augmentera à chaque click, ou à chaque fois que la commande est éxecutée !
if n==1: # APrès le premier click :
Af1.configure ( text=u"Veuillez répondre en entrant la lettre correspondant à votre choix.")
Bout1.configure(text=u"Ok")
elif n==2: # Après le deuxième click le jeu commence.
Af1.pack_forget() #L'affichage 1 ne sera plus utile.
Af2.pack() # On affiche l'énoncé des questions.
Af3.pack()
Af4.pack()
Af5.pack()
Af6.pack()
Ent1.pack() # On affiche l'endroit où le joueur rentrera sa réponse
Bout1.configure(text=u"Valider ma réponse.") # Le bouton 1 vérifiera dorénavant la justesse de la réponse
Af2.configure ( text=u"Question"+str(k)+ # Affichage des réponses.
Q str(k).enonce)
Af3.configure ( text=u"Réponse A :"
Q str(k).rep1)
Af4.configure ( text=u"Réponse B :"
Q str(k).rep2)
Af5.configure ( text=u"Réponse C :"
Q str().rep3)
else: # A chaque fois que le joueur clickera sur le bouton 1, la réponse du joueur sera vérifiée.
repjoueur=Ent1.get() #On enregistre la réponse sous un autre nom qui nous permettra de meux la reconnaitre.
repjoueur= repjoueur.upper() # Ce que rentre le joueur est mis en majuscule.
if repjoueur=Q str(k).repjuste:
Af7.pack()
Af7.configure(text=u"Bonne réponse ! vous pouvez passer la question suivante")
Bout2.pack() # LE bouton permettant de passer à la question suivante apparait.
else :
Af7.pack()
Af7.configure(text=u" Mauvaise réponse ! Vous avez répondu "+repjoueur+" alors que la bonne réponse était la "+Q str(k).repjuste+".")
Bout2.pack()
def ma_commande2 (): # Commande pour paser à la question suivante.
k=k+1 #On augmente le compteur de question.
Ent1.delete(0,END)
Af2.configure ( text=u"Question"+str(k)+ # On affiche la question suivante.
Q str(k).enonce)
Af3.configure ( text=u"Réponse A :"
Q str(k).rep1)
Af4.configure ( text=u"Réponse B :"
Q str(k).rep2)
Af5.configure ( text=u"Réponse C :"
Q str(k).rep3)
Bout2.pack_forget() #Le bouton disparait.
Bout1=Button(Fen1,text=u"Oui",command=ma_commande1)
Bout2=Button(Fen1,text=u"Question Suivante",command=ma_commande2)
Af1.pack()
Af2.pack_forget()
Af3.pack_forget()
Af4.pack_forget()
Af5.pack_forget()
Af6.pack_forget()
Ent1.pack_forget()
Bout1.pack()
Af7.pack_forget()
Bout2.pack_forget()
Fen1.mainloop()
Merci encore !!

2 réponses

  1. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    'lut, quel bazar ce code, où est passé l'indentation? M'enfin elle se devine assez facilement, donc ça va.

    Donc, ce
    Q str(k)
    , tu le sors d'où? Si le Q est censé être affiché, c'est entre guillemets qu'il doit être. Après,
    str(k)
    donne sous forme de caractères le numéro de la question; et tu tentes d'utiliser les propriétés
    .enonce
    et
    .rep1, .rep2, .rep3
    dessus...
    Ces propriétés sont, je présume, une partie d'une liste de questions, or je ne la vois nulle part décrit d'ailleurs; ainsi faudrait-il la déclarer, exemple:
    Q = [{'enonce': "De quelle couleur est le cheval blanc d'Henri IV?", 'rep1': "Blanc", 'rep2': "Noir", 'rep3': "Gris", 'repjuste': 1},
    {'enonce': "Quand le feu est rouge, tu fais quoi?", 'rep1': "J'appuie sur le champignon!", 'rep2': "J'menfou!", 'rep3': "Je freine comme un fou", 'repjuste': 2}]

    Et ensuite on s'en sert:
    Af2.configure ( text=u"Question"+str(k)+": "+Q[k]["enonce"]) 
    Af3.configure ( text=u"Réponse A : "+Q[k]["rep1"]) 
    Af4.configure ( text=u"Réponse B : "+Q[k]["rep2"]) 
    Af5.configure ( text=u"Réponse C :"+Q[k]["rep3"])

    Pour accéder à la question k, on utilise des crochets, car Q est une liste. Et entre crochets, on mets une variable numérique entière (pas décimale, ni de représentation en caractères). Et pour les parties de la question, de même mais avec le nom de la propriété.
    from human import idiocy
    del idiocy
    0
  2. man0n
     
    [CODE] # -*- coding: cp1252 -*-
    class Question:
    """Classe définissant une liste de question:
    -son énoncé
    -sa réponse 1
    -sa réponse 2
    -sa réponse 3
    -sa réponse juste"""

    def __init__(self, enonce="", rep1="", rep2="", rep3="", repjuste=""): # Définition des objetss de la classe
    self.enonce = enonce
    self.rep1 = rep1
    self.rep2= rep2
    self.rep3 = rep3
    self.repjuste = repjuste

    n=1 #compteur du nombre de question

    # -*- coding: cp1252 -*-
    from Tkinter import* # On importe Tkinter, on utilisera l'iinerface pour faciliter l'enregistrement de question dans un dictionnaire.
    Fen1=Tk() #Création de la fênetre, des entrées, etc
    Fen1.title(u"Création question")

    Af1=Label(Fen1, text= u"Ecrire une question.")
    Af2=Label(Fen1, text="Ecrire la réponse 1.")
    Af3=Label(Fen1, text="Ecrire la réponse 2.")
    Af4=Label(Fen1, text="Ecrire la réponse 3.")
    Af5=Label(Fen1, text="Ecrire la réponse juste.")
    Af6=Label(Fen1, text="")
    Ent1=Entry(Fen1)
    Ent2=Entry(Fen1)
    Ent3=Entry(Fen1)
    Ent4=Entry(Fen1)
    Ent5=Entry(Fen1)

    Q1=Question () # Pour faciliter l'écriture on renomme la classe

    def ma_commande1(): # On crée une commande qui à pour but de vérifier si toutes les entrées possèdent un texte.
    enonce=Ent1.get() # On renomme les textes entrés pur faciliter l'utilisation de ceux-ci et meiux les reconnaitre.
    rep1=Ent2.get()
    rep2=Ent3.get()
    rep3=Ent4.get()
    repjuste=Ent5.get()
    if enonce=="" or rep1=="" or rep2=="" or rep3=="" or repjuste=="": # On intègre une condition permettant de vérifier si les entrées sont vides.
    Bout2.pack_forget () # Ainsi le bouton disparaitra.
    Af6.configure(text= u"Vous n'avez pas rempli toutes les cases") # On précise le problème à l'utilisateur.
    else:
    Bout2.pack () # Si les entrées possédent un texte le bouton apparaitra.
    Af6.configure(text= u"")

    questions = [] #on crée une liste

    def ma_commande2():
    q=Question(Ent1.get(), Ent2.get(), Ent3.get(), Ent4.get(), Ent5.get()
    questions.append(q)

    Ent1.delete(0,END)
    Ent2.delete(0,END)
    Ent3.delete(0,END)
    Ent4.delete(0,END)
    Ent5.delete(0,END)

    q=questions[k]

    Af1.configure(text= u"Ecrire une question "+ str(n)+'.') # On met à jour le numéro de la question, de l'énoncé ....
    Af2.configure(text= u"Ecrire la réponse 1, de la question "+ str(n)+'.')
    Af3.configure(text= u"Ecrire la réponse 2, de la question "+ str(n)+'.')
    Af4.configure(text= u"Ecrire la réponse 3, de la question "+ str(n)+'.')
    Af5.configure(text= u"Ecrire la réponse juste, de la question "+ str(n)+'.')
    Bout2.pack_forget () # On fait dispaaitre le bouton pour que l'utilsateur ne puisse l'utiliser.

    Bout1=Button(Fen1,text=u"Vérifie",command=ma_commande1) # Création des boutons
    Bout2=Button(Fen1,text=u"Enregistre les questions ici !",command=ma_commande2)

    Af1.pack() # Affichage
    Ent1.pack()
    Af2.pack()
    Ent2.pack()
    Af3.pack()
    Ent3.pack()
    Af4.pack()
    Ent4.pack()
    Af5.pack()
    Ent5.pack()
    Af6.pack()
    Bout1.pack()
    Bout2.pack_forget()

    Fen1.mainloop()/CODE

    Ceci est un autre programme censé etre le debut des que le premier marchera ou Q est defini c'est une classe.
    0
    1. ElementW Messages postés 5690 Statut Contributeur 1 293
       
      coding: cp1252
      Je vais te tuer.
      0
    2. man0n
       
      Quoi ?!
      0
    3. man0n
       
      je vais tenter de remettre le code attends

      # -*- coding: cp1252 -*-

      from Tkinter import *

      class Question:
      """Classe définissant une question :
      - son énoncé
      - sa réponse 1
      - sa réponse 2
      - sa réponse 3
      - sa réponse juste"""

      def __init__(self, enonce="", rep1="", rep2="", rep3="", repjuste=""):
      self.enonce = enonce
      self.rep1 = rep1
      self.rep2 = rep2
      self.rep3 = rep3
      self.repjuste = repjuste
      # end def
      # end class Question

      #permet d'afficher avec print
      def __str__(self):
      return "enonce=%s ; rep1=%s ; rep2=%s ; rep3=%s ; repJuste=%s" % (self.enonce, self.rep1, self.rep2, self.rep3, self.repjuste)

      # création de la fenetre principale pour l'enregistrement de question/réponses
      Fen1 = Tk()
      # titre donné à la fenêtre
      Fen1.title(u"Création question")
      # création d'un compteur du nombre de questions
      nb_question = 1
      # création de la liste qui servira à stocker les questions
      liste_questions = list()

      message_numero_question= stringVar()
      # création d'une étiquette qui indiquera le numéro de la question
      message_numero_question.set(u"Question numéro {}".format(nb_question))
      Label(Fen1,textvariable = message_numero_question,
      bg="red",
      fg="white",
      font="serif 12 bold italic").pack(expand=1, fill=X)


      #Pour l'énoncé
      Af1=Label(Fen1,text=u"Veuillez entrer l'énoncé de votre question :".pack() #affichage immédiat
      # zone de saisie de l'énoncé
      Ent_enonce = Entry(Fen1)
      #affichage immédiat avec .pack()
      Ent_enonce.pack()

      #Pour les réponses
      Af2=Label(Fen1,text=u"Réponse numéro A :").pack()
      Ent_rep1 = Entry(Fen1)
      Ent_rep1.pack()
      Af3=Label(Fen1,text=u"Réponse numéro B :").pack()
      Ent_rep2 = Entry(Fen1)
      Ent_rep2.pack()
      Af4=Label(Fen1,text=u"Réponse numéro C :").pack()
      Ent_rep3 = Entry(Fen1)
      Ent_rep3.pack()
      Af5=Label(Fen1,text=u"Veuillez saisir la lettre de la bonne réponse :").pack()
      Ent_repjuste = Entry(Fen1)
      Ent_repjuste.pack()

      # je récupère les données des zones de saisie
      def verifier():
      enonce = Ent_enonce.get()
      rep1 = Ent_rep1.get()
      rep2 = Ent_rep2.get()
      rep3 = Ent_rep3.get()
      repjuste = entree_repjuste.get()
      # formulaire incomplet
      if enonce=="" or rep1=="" or rep2=="" or rep3=="" or repjuste=="":
      # masquer le bouton d'enregistrement
      bouton_enregistrer.pack_forget()
      Af6.configure(text= u"Vous n'avez pas rempli toutes les cases" )
      # tout est rempli:
      else:
      # montrer le bouton d'enregistrement
      bouton_enregistrer.pack()
      # end if
      # end def

      # Enregistrement des données
      def enregistrer():
      global nb_question
      # enregistrement des questions dans la liste.
      liste_questions.append(Question(enonce = Ent_enonce.get(),
      rep1 = Ent_rep1.get(),
      rep2 = Ent_rep2.get(),
      rep3 = Ent_rep3.get(),
      repjuste = Ent_repjuste.get()))
      # effacement des zones de saisie
      Ent_enonce.delete(0, END)
      Ent_rep1.delete(0, END)
      Ent_rep2.delete(0, END)
      Ent_rep3.delete(0, END)
      Ent_repjuste.delete(0, END)

      # je passe à la question suivante
      nb_question += 1
      #mise a jour de l'étiquette
      message_numero_question.set(u"Question numéro {}".format(nb_question))

      # masquer le bouton d'enregistrement
      bouton_enregistrer.pack_forget()
      # end def

      #fermeture de la fenêtre
      def fermer():
      enonce = Ent_enonce.get()
      Question.enonce = enonce
      rep1 = Ent_rep1.get()
      Question.rep1 = rep1
      rep2 = Ent_rep2.get()
      Question.rep2 = rep2
      rep3 = Ent_rep3.get()
      Question.rep3 = rep3
      repjuste = Ent_repjuste.get()
      Question.repjuste = repjuste
      print"last question=", Question
      Q = Question(Question.enonce, Question.rep1, Question.rep2, Question.rep3, Question.repjuste)
      liste_Questions.append(Q)
      Fen1.destroy()
      #End def

      # création des boutons
      # bouton 'Vérifier'
      bouton_verifier = Button(Fen1,text=u"Vérifier",command=verifier,)
      bouton_verifier.pack()
      # bouton 'Enregistrer'
      bouton_enregistrer = Button(Fen1,text=u"Enregistrer ma question",command=enregistrer)
      #On ne l'affiche pas immediatement
      # bouton 'Fermer'
      bouton_fermer = Button(Fen1ntext=u"Fermer la fenêtre",command=fermer)
      bouton-fermer.pack()

      fenetre.mainloop()

      #affiche les questions sauvegardees dans la liste
      for index in range(len(liste_question)):
      print liste_questions[index]
      0
    4. man0n
       
      voila c'est mieux non ? j'ai un probleme avec Ent_enonce apparement une erreur de syntaxe.
      (je l'ai amélioré depuis hier oui)
      0
    5. ElementW Messages postés 5690 Statut Contributeur 1 293
       
      Nan je ne parlais pas de ton code en soi, mais du fait que tu utilises un encodage de merde; il serait temps de se mettre à l'Unicode/UTF-8. Télécharges-toi un vrai éditeur de texte (Notepad++ par ex) si ton éditeur actuel ne le gères pas; réencodes la source et met
      codepage: utf-8
      0