QCM avec tkinter

Fermé
man0n - Modifié par dsy73 le 1/03/2014 à 19:22
davs63 Messages postés 8 Date d'inscription dimanche 12 juillet 2009 Statut Membre Dernière intervention 4 mars 2014 - 4 mars 2014 à 09:53
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

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
Modifié par gravgun le 1/03/2014 à 21:11
'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
[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
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
1 mars 2014 à 21:07
coding: cp1252
Je vais te tuer.
0
Quoi ?!
0
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
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
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
2 mars 2014 à 17:16
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