Bonjour internautes et visiteurs venus d'ailleurs!
Je me retrouve confronté à un soucis de logique et également surement à un manque de compétences en python x)
J'ai réalisé un QCM en python et il m'a pris l'idée de le mettre sur une interface graphique plutôt que cette bien gentille mais un peu moche ligne de commande
Je me suis donc attaqué a Tkinter et tous ses merveilleux widgets!
Je bloque au niveau des 3 Checkbox que j'ai crée pour chaque choix proposé à l'utilisateur.
J'aimerai pouvoir faire que mon programme récupère la première lettre du choix (qui est donc en soi la réponse que l'on veut donner), la stock dans la variable "rep" pour faire la comparaison avec la réponse contenu à la fin de la liste.
J'ai donc essayé de mettre dans la commande de la checkbox, une référence à la fonction créée tout en bas qui permettrait de justement stocker la réponse. Cela ne fonctionne visiblement pas. Je ne comprend pas super bien encore le fonctionnement du "self" et ducoup du "def__init__(self)".
J'ai également un petit soucis avec ma première fenetre qui ne veut pas se fermer au moment ou je clique sur le bouton que j'ai crée dessus.
Le code:
# -*-coding:Latin-1 -*
from tkinter import *
fenetre = Tk()
champ_label= Label(fenetre, text="Bienvenue dans notre QCM sur le B2i lycee, nous proposons une question par item, chaque item est range dans son domaine respectif.\nRappelons que pour valider le B2i, il faut valider les cinq domaines \nAttention ! Pour valider les cinq domaines, il faut valider au moins 80% du B2i en ayant 50% de bonne reponses minimum dans chaque domaine.\n")
champ_label.pack()
champ_label2= Label(fenetre, text="Quel est votre nom ?")
champ_label2.pack()
var_texte = StringVar()
ligne_texte = Entry(fenetre, textvariable=var_texte, width=30)
ligne_texte.pack()
nomJoueur = var_texte.get()
champ_label3= Label(fenetre, text="Pret?"+nomJoueur+" Alors commencons !\n")
champ_label3.pack()
bouton_quitter = Button(fenetre, text="GOOOO!", command=fenetre.quit)
bouton_quitter.pack()
questions=[["\n1.Quelle est la signification du mot fichier ?\n" , "A.Il s\'agit du nom donne a un document enregistre a partir de l`ordinateur.\n","B.Un fichier peut contenir une image, du texte ecrit, ou meme du son.\n","C.Un fichier ne peut contenir que du texte\n ", "C"],
["\n2.Quelle est la signification du mot dossier ?\n" , "A.Il s\'agit du nom donne a un document enregistre uniquement sur une disquette.\nB.Un dossier peut contenir plusieurs fichiers differents:Un fichier image, un fichier texte, ou meme un fichier son.\nC.Un dossier ne peut contenir que du texte\n", "A"],
["\n3.Quelle est la bonne definition ?\n" , "A.La corbeille, C\'est un accessoire qui sert a trier un fichier.\nB.Un icone, Il s\'agit d\'une petite image qui permet de realiser une action sur l`ordinateur ou d\'acceder a un logiciel.\nC.Un dossier, C\'est le nom d`un seul fichier que l`on considere comme tres important\n","B"],
["\n4.Trois d\'entre eux ont une fonction identique : memoriser l\'information, Rechercher l\'intrus qui s\'est glisse dans cette liste\n", "A. Une disquette.\nB. Le modem.\nC. Le Cederom.\n", "B"],
["\n5.Un seul des quatre ne permet pas de saisir de l\'information. Lequel ?\n ", "A. Le microphone.\nB. Le scanner.\nC. Le moniteur\n", "C"],
["\n6.Qu\'est ce qu`un modem?\n", "A. Un modem est un compteur qui permet de relever le temps d`une conversation.\nB. Un modem est un appareil qui permet l\'echange d\'informations entre des ordinateurs via les lignes telephoniques (voir reseaux informatiques). Le modem sert d\'intermediaire et permet de transformer le langage de l\'ordinateur pour que le message puisse se deplacer dans les fils du telephone.\nC.Un modem est un boitier qui remplace la ligne de telephone\n","B"],
["\n7.Un seul correspond a la bonne definition et au bon usage de l\'imprimante. Lequel?\n", "A.Elle dispose d`un ruban enduit d\'encre qui permet d\'imprimer du texte ou des images. Il suffit de relier l\'imprimante a l\'ordinateur et a une prise de courant pour qu\'elle fonctionne.\nB. Une imprimante dispose d\'une ou plusieurs cartouches d`encre. Lorsqu\'une cartouche est vide il convient de la changer (ou sur certains modeles de la remplir d\'encre.). Pour pouvoir fonctionner correctement une imprimante doit etre reconnu par l\'ordinateur au moment de son installation.\nC.Une imprimante est un systeme qui permet d`envoyer et de recevoir des fichiers\n","B"],
["\n8.Pour enregistrer un travail sur une disquette...\n", "A. Je vais dans \"fichier \" et \"enregistrer sous \" et je selectionne le lecteur de disquettes A,\(ou il est ecrit \"enregistrer dans\" \).\nB. J\'appelle mon fichier \"disquette A\".\nC.Je fais un copier-coller sur le bureau pour enregistrer sur la disquette 'A'\n","A"],
["\n9.Quelle est la bonne procedure pour enregister un fichier ?\n", "A. Cliquer sur enregistrer et choisir le dossier dans la liste.\nB. Cliquer sur 'Enregistrer sous ...' , et choisir le dossier dans la liste.\nC.Copier le document , puis le coller dans le dossier de son choix\n","B"],
["\n10.Que signifie le sigle 'www' ?\n", "A. Waste Work Web.\nB.Wild Wild West.\nC.World Wide Web\n","C"]]
pointsplus = 0
pointsmoins = 0
for question in questions:
fenetre2 = Tk()
def __init__(self):
champ_label4= Label(fenetre2, text=question[0])
champ_label4.pack()
var_case1 = IntVar()
var_case2 = IntVar()
var_case3 = IntVar()
case1 = Checkbutton(fenetre2, text=question[1], variable=var_case1, command=self.choix)
case2 = Checkbutton(fenetre2, text=question[2], variable=var_case2, command=self.choix)
case3 = Checkbutton(fenetre2, text=question[3], variable=var_case3, command=self.choix)
case1.pack()
case2.pack()
case3.pack()
rep=input("Ma réponse")
if rep!= question[2]:
pointsmoins=pointsmoins+2
print("Reponse incorrecte",N,"Question suivante !\n")
elif rep== question[2]:
pointsplus=pointsplus+2
print("Reponse correcte",N,"Question suivante !\n")
else:
break
#On calcul les points
R = pointsplus - pointsmoins
print (R)
#On donne les résultats
niveaux=[["20","Bravo"],
["16","Presque excellent"],
["12","Peut mieux faire"],
["10","C'est limite"],
["5","Rate"],
["2","Pourquoi as-tu fais ce test?"]]
for niveau in niveaux:
if R >= int(niveau[0]):
print (R"/20, ",niveau[1]," ")
break
def choix(self):
rep= question[0:1]
return rep
Merci d'avance pour le temps que vous pourrez consacrer à mon problème!
Je pense que tu es parti dans quelque chose d'un peut trop compliqué pour la suit
moi j'utilise __init__ mais pour initialiser des classes. Hors ici tu ne crée pas de classe, je ne vois pas ce que tu veux faire avec. A mon avis, tu as piqué un bout de code dans un tuto sans remarqué qu'il était écrit "pour faire des bouttons dans une classe ...."
Il vaudrait mieux que tu crées une fenetre avec tes 3 boutons, tes 3 textes et un bouton valider les réponces
comme ça dans valider tu met à jour tes scores et tu change les questions
# -*-coding:Latin-1 -*
from Tkinter import *
fenetre = Tk()
champ_label= Label(fenetre, text="Bienvenue dans notre QCM sur le B2i lycee, nous proposons une question par item, chaque item est range dans son domaine respectif.\nRappelons que pour valider le B2i, il faut valider les cinq domaines \nAttention ! Pour valider les cinq domaines, il faut valider au moins 80% du B2i en ayant 50% de bonne reponses minimum dans chaque domaine.\n")
champ_label.pack()
champ_label2= Label(fenetre, text="Quel est votre nom ?")
champ_label2.pack()
var_texte = StringVar()
ligne_texte = Entry(fenetre, textvariable=var_texte, width=30)
ligne_texte.pack()
nomJoueur = var_texte.get()
champ_label3= Label(fenetre, text="Pret?"+nomJoueur+" Alors commencons !\n")
champ_label3.pack()
bouton_quitter = Button(fenetre, text="GOOOO!", command=fenetre.destroy)
bouton_quitter.pack()
fenetre.mainloop()
questions=[["\n1.Quelle est la signification du mot fichier ?\n" , "A.Il s\'agit du nom donne a un document enregistre a partir de l`ordinateur.\n","B.Un fichier peut contenir une image, du texte ecrit, ou meme du son.\n","C.Un fichier ne peut contenir que du texte\n ", "C"],
["\n2.Quelle est la signification du mot dossier ?\n" , "A.Il s\'agit du nom donne a un document enregistre uniquement sur une disquette.\nB.Un dossier peut contenir plusieurs fichiers differents:Un fichier image, un fichier texte, ou meme un fichier son.\nC.Un dossier ne peut contenir que du texte\n", "A"],
["\n3.Quelle est la bonne definition ?\n" , "A.La corbeille, C\'est un accessoire qui sert a trier un fichier.\nB.Un icone, Il s\'agit d\'une petite image qui permet de realiser une action sur l`ordinateur ou d\'acceder a un logiciel.\nC.Un dossier, C\'est le nom d`un seul fichier que l`on considere comme tres important\n","B"],
["\n4.Trois d\'entre eux ont une fonction identique : memoriser l\'information, Rechercher l\'intrus qui s\'est glisse dans cette liste\n", "A. Une disquette.\nB. Le modem.\nC. Le Cederom.\n", "B"],
["\n5.Un seul des quatre ne permet pas de saisir de l\'information. Lequel ?\n ", "A. Le microphone.\nB. Le scanner.\nC. Le moniteur\n", "C"],
["\n6.Qu\'est ce qu`un modem?\n", "A. Un modem est un compteur qui permet de relever le temps d`une conversation.\nB. Un modem est un appareil qui permet l\'echange d\'informations entre des ordinateurs via les lignes telephoniques (voir reseaux informatiques). Le modem sert d\'intermediaire et permet de transformer le langage de l\'ordinateur pour que le message puisse se deplacer dans les fils du telephone.\nC.Un modem est un boitier qui remplace la ligne de telephone\n","B"],
["\n7.Un seul correspond a la bonne definition et au bon usage de l\'imprimante. Lequel?\n", "A.Elle dispose d`un ruban enduit d\'encre qui permet d\'imprimer du texte ou des images. Il suffit de relier l\'imprimante a l\'ordinateur et a une prise de courant pour qu\'elle fonctionne.\nB. Une imprimante dispose d\'une ou plusieurs cartouches d`encre. Lorsqu\'une cartouche est vide il convient de la changer (ou sur certains modeles de la remplir d\'encre.). Pour pouvoir fonctionner correctement une imprimante doit etre reconnu par l\'ordinateur au moment de son installation.\nC.Une imprimante est un systeme qui permet d`envoyer et de recevoir des fichiers\n","B"],
["\n8.Pour enregistrer un travail sur une disquette...\n", "A. Je vais dans \"fichier \" et \"enregistrer sous \" et je selectionne le lecteur de disquettes A,\(ou il est ecrit \"enregistrer dans\" \).\nB. J\'appelle mon fichier \"disquette A\".\nC.Je fais un copier-coller sur le bureau pour enregistrer sur la disquette 'A'\n","A"],
["\n9.Quelle est la bonne procedure pour enregister un fichier ?\n", "A. Cliquer sur enregistrer et choisir le dossier dans la liste.\nB. Cliquer sur 'Enregistrer sous ...' , et choisir le dossier dans la liste.\nC.Copier le document , puis le coller dans le dossier de son choix\n","B"],
["\n10.Que signifie le sigle 'www' ?\n", "A. Waste Work Web.\nB.Wild Wild West.\nC.World Wide Web\n","C"]]
pointsplus = 0
pointsmoins = 0
class Demander:
def __init__(self,question):#Ici on défini toutes les variables de l'objet
self.question = question
self.fenetre2 = Tk()
self.champ_label4= Label(self.fenetre2, text=question[0])
self.champ_label4.pack()
self.var_case1 = IntVar()
self.var_case2 = IntVar()
self.var_case3 = IntVar()
self.case1 = Checkbutton(self.fenetre2, text=question[1], variable=self.var_case1)
self.case2 = Checkbutton(self.fenetre2, text=question[2], variable=self.var_case2)
self.case3 = Checkbutton(self.fenetre2, text=question[3], variable=self.var_case3)
self.case1.pack()
self.case2.pack()
self.case3.pack()
self.Bouton = Button(self.fenetre2,text = "Valider",command = self.valider)
self.Bouton.pack()
def valider(self):#Ceci est une fonction
print(self.var_case1.get(),self.var_case2.get(),self.var_case3.get())
D =Demander(questions[0])
D.fenetre2.mainloop()#On affiche le fenetre de l'objet D
Voilà, vue que tu as utiliser __init__ je te propose une solution qui s'en sert.
J'ai créé une classe appelée "Demander" et qui prend en argument
Ce qui fait que lorsque j'écris D = Demander(questions[0])
je crée un Objet de la classe "Demander" et qui va s'appeler "D"
Qu'est ce qu'un objet ? ben google est ton ami
Plus sérieusement prenons l'exemple des chaises. Ce sont des objets, elles ont la même fonctions mais pas toutes les mêmes variables (certaines sont plus grandes que d'autres, pas la même couleur ...) Ben en info c'est pareil
D va avoir les même fonctions que tout les objets de classe "Demander" mais pas les même valeurs dans ses variables.
le "self.x" sert à dire on associe à l'objet une variable qui s'appelle x (tu remarques donc que fenetre2 ainsi que tout tes boutons sont des variables associées à l'objet
pour les fonctions, on les écrits :
def fonction(self,argument1,argument2,...):
bla bla bla .....
Pourquoi on met un "self" dans les arguments ? Pour que les fonctions puissent accéder aux variables associées à l'objet.
la fonction a accès à self.var_case1 grace au self qui est dans les arguments. Au passage, var_case1 est le no de ta variable, il faut faire var_case1.get() si tu veux savoir ce qu'elle contient (1 si la case est cochée et 0 sinon)
Dernière info : tu peux modifier les variables d'un objet par la suite. Pour cela tu fais : nom_objet.nom_variable = ...
C'est ce que je fais avec : D.fenetre2.mainloop() # On applique .mainloop() à notre variable fenetre2 de l'objet D car la pauvre fentêtre à été complettement définie dans la partit __init__ mais on ne l'a pas affichée
Voilà, tu n'a plus qu'à modifier la fonction valider pour qu'elle modifie les scores et que si c'est la dernière question elle supprime la fenetre pour afficher celle des résultats
Le problème que j'ai maintenant c'est que quand je clique sur valider rien ne se passe.
Et quand je rentre dans ma fenetre2, sur la console il s'affiche directement "réponse incorrecte" sans même avoir commencé à répondre.
Je n'arrive pas à comprendre comment faire afficher la question suivante car à chaque fois que je veux quitter la fenêtre je reste sur la même question et il continue de s'afficher "réponse incorrecte" sur la console derrière.
Je vois donc que le programme rentre bien dans ma boucle "for" mais apparemment ne veux pas parcourir la liste =(
J'ai essayé, avec la fonction "valider", de faire le traitement que je voulais faire à la base, récupérer le premier caractère mais je ne suis vraiment pas sur d'avoir fais quelque chose de juste et qui fonctionne même si ça parait totalement logique pour moi x)
Je connais bien les notions d'objets, de fonctions et classe mais j'avoue ne pas être super à l'aise avec leur concept et leur fonctionnement. Est-ce que le "__init__" est comme un "private:" en C ou C++?
"sur la console il s'affiche directement "réponse incorrecte" sans même avoir commencé à répondre"
Parce qu'il sait que tu vas répondre faux. Je te taquine .
Est-ce que ton utilisation des print() est pour du déboggage? Parce que si ce n'est pas le cas, il ne faut pas mélanger l'affichage interface avec l'affichage console. Pour afficher quelque chose sur ton interface, on utilise des label.
Ensuite ton programme est beaucoup trop violent. L'utilisation des classes est totalement disproportionnée. Conceptuellement, il te faut quelques Label, 1 Entry, et puis 1 Button question suivante. Ensuite il suffit juste de changer l'intitulé de chaque objet quand tu passe à la question suivante.
PS: Un bon point pour ton organisation des questions .
Voici un exemple que tu pourrais adapter, ou même t'en servir pour résoudre les problèmes de ton propre code. L'interface n'est pas génial, mais le comportement est propre (je pense):
#Code simpliste
import tkinter as tk
from random import choice
#Liste des questions:
lst_qst = [("Nbre doigt main", "A. 3", "B. 4", "C.5", "C"),
("Couleur cheval blanc", "A. Blanc", "B. Vert", "C. Bleu", "A"),
("Première lettre alphabet", "A. B", "B. C", "C. A", "C")]
#Variable qui va conserver la réponse et le décompte des points
ctrl = ["", 0]
def init():
for child in fen.winfo_children():
child["state"] = "normal"
#Utilisation de la fonction suivant() pour afficher la 1ère question
suivant()
#Changement de la fonction associée à btn pour la suite et de son texte
btn["text"] = "Question suivante"
btn["command"] = suivant
def suivant():
if lst_qst: #tant qu'il reste des questions
lot = choice(lst_qst)
lst_qst.remove(lot)
qst["text"], chx1["text"], chx2["text"], chx3["text"], ctrl[0] = lot
#On désactive la possibilité de passer à la question suivante
btn["state"] = "disabled"
else:
#S'il n'y a plus de question:
for child in fen.winfo_children():
child["state"] = "disabled"
#On réactive le msg et on affiche quelquechose:
msg["state"] = "normal"
msg["text"] = "Fin de partie. Ton score est de {}".format(ctrl[1])
#Le bouton suivant est de nouveau modifier
btn["state"] = "normal"
btn["text"] = "Quitter"
btn["command"] = fen.destroy #On ne met que le callback (sans les ())
def verif(event):
if rep.get() == ctrl[0]:
msg["text"] = "Bonne réponse GG"
ctrl[1] += 1
else:
msg["text"] = "Looser ;)"
#On réactive le bouton pour passer à la question suivante
btn["state"] = "normal"
#Initialisation
fen = tk.Tk()
qst = tk.Label(fen, text="", state="disabled")
chx1 = tk.Label(fen, text="", state="disabled")
chx2 = tk.Label(fen, text="", state="disabled")
chx3 = tk.Label(fen, text="", state="disabled")
rep = tk.Entry(fen, state="disabled")
rep.bind('<Return>', verif)
msg = tk.Label(fen, text="", state="disabled")
btn = tk.Button(fen, text="Démarrer", command=init)
#Placement des objets
for child in fen.winfo_children():
child.pack()
Mais je suis du genre violent moi! Je fais pas dans la dentelle xP
Et l'organisation des questions est de toi Olygrim, tu m'avais déjà aidé au moment de FAIRE le Qcm et que j'avais posté sur le forum pour demander de l'aide en fait >.< Mais merci quand meme xS
Plus sérieusement, l'utilisation des classes m'a ducoup été conseillé par fauquette plus haut. Et je voulais un peu de challenge est justement ne pas faire une simple zone d'entrée mais des cases à cocher x)
Cependant je crois que je vais déjà me contenter de ça, on verra après
Je vais déjà essayer de faire quelque chose avec l'exemple que tu m'as donné. J'ai cherché mais je ne comprend pas trop la fonction du "fen.winfo_children" =s Et si possible, pourrais tu m'expliquer le début de la fonction "suivant", je ne comprend pas le fonctionnement du "choice" et comment le programme fait pour savoir que le dernière indice de la liste est la réponse, le deuxième le premier choix,...? Est-ce que il permet de séparer les différentes parties de la liste et permet d'associer la variables à l'élément de la liste correspondant?
J'ai pas eu le temps de finir mais voila déjà ce que j'ai pu faire en me servant de ton exemple :
# -*-coding:Latin-1 -*
from tkinter import *
fenetre = Tk()
champ_label1= Label(fenetre, text="Bienvenue dans notre QCM sur le B2i lycee, nous proposons une question par item, chaque item est range dans son domaine respectif.\nRappelons que pour valider le B2i, il faut valider les cinq domaines \nAttention ! Pour valider les cinq domaines, il faut valider au moins 80% du B2i en ayant 50% de bonne reponses minimum dans chaque domaine.\n")
champ_label1.pack()
champ_label2= Label(fenetre, text="Quel est votre nom ?")
champ_label2.pack()
var_texte = StringVar()
ligne_texte = Entry(fenetre, textvariable=var_texte, width=30)
ligne_texte.pack()
nomJoueur = var_texte.get()
champ_label3= Label(fenetre, text="Pret?"+nomJoueur+" Alors commencons !\n")
champ_label3.pack()
bouton_quitter = Button(fenetre, text="GOOOO!", command=fenetre.destroy)
bouton_quitter.pack()
fenetre.mainloop()
questions=[["\n1.Quelle est la signification du mot fichier ?\n" , "A.Il s\'agit du nom donne a un document enregistre a partir de l`ordinateur.\n","B.Un fichier peut contenir une image, du texte ecrit, ou meme du son.\n","C.Un fichier ne peut contenir que du texte\n ", "C"],
["\n2.Quelle est la signification du mot dossier ?\n" , "A.Il s\'agit du nom donne a un document enregistre uniquement sur une disquette.\n","B.Un dossier peut contenir plusieurs fichiers differents:Un fichier image, un fichier texte, ou meme un fichier son.\n","C.Un dossier ne peut contenir que du texte\n", "A"],
["\n3.Quelle est la bonne definition ?\n" , "A.La corbeille, C\'est un accessoire qui sert a trier un fichier.\n","B.Un icone, Il s\'agit d\'une petite image qui permet de realiser une action sur l`ordinateur ou d\'acceder a un logiciel.\n","C.Un dossier, C\'est le nom d`un seul fichier que l`on considere comme tres important\n","B"],
["\n4.Trois d\'entre eux ont une fonction identique : memoriser l\'information, Rechercher l\'intrus qui s\'est glisse dans cette liste\n", "A. Une disquette.\n","B. Le modem.\n","C. Le Cederom.\n", "B"],
["\n5.Un seul des quatre ne permet pas de saisir de l\'information. Lequel ?\n ", "A. Le microphone.\n","B. Le scanner.\n","C. Le moniteur\n", "C"],
["\n6.Qu\'est ce qu`un modem?\n", "A. Un modem est un compteur qui permet de relever le temps d`une conversation.\n","B. Un modem est un appareil qui permet l\'echange d\'informations entre des ordinateurs via les lignes telephoniques (voir reseaux informatiques). Le modem sert d\'intermediaire et permet de transformer le langage de l\'ordinateur pour que le message puisse se deplacer dans les fils du telephone.\n","C.Un modem est un boitier qui remplace la ligne de telephone\n","B"],
["\n7.Un seul correspond a la bonne definition et au bon usage de l\'imprimante. Lequel?\n", "A.Elle dispose d`un ruban enduit d\'encre qui permet d\'imprimer du texte ou des images. Il suffit de relier l\'imprimante a l\'ordinateur et a une prise de courant pour qu\'elle fonctionne.\n","B. Une imprimante dispose d\'une ou plusieurs cartouches d`encre. Lorsqu\'une cartouche est vide il convient de la changer (ou sur certains modeles de la remplir d\'encre.). Pour pouvoir fonctionner correctement une imprimante doit etre reconnu par l\'ordinateur au moment de son installation.\n","C.Une imprimante est un systeme qui permet d`envoyer et de recevoir des fichiers\n","B"],
["\n8.Pour enregistrer un travail sur une disquette...\n", "A. Je vais dans \"fichier \" et \"enregistrer sous \" et je selectionne le lecteur de disquettes A,\(ou il est ecrit \"enregistrer dans\" \).\n","B. J\'appelle mon fichier \"disquette A\".\n","C.Je fais un copier-coller sur le bureau pour enregistrer sur la disquette 'A'\n","A"],
["\n9.Quelle est la bonne procedure pour enregister un fichier ?\n", "A. Cliquer sur enregistrer et choisir le dossier dans la liste.\n","B. Cliquer sur 'Enregistrer sous ...' , et choisir le dossier dans la liste.\n","C.Copier le document , puis le coller dans le dossier de son choix\n","B"],
["\n10.Que signifie le sigle 'www' ?\n", "A. Waste Work Web.\n","B.Wild Wild West.\n","C.World Wide Web\n","C"]]
fenetre2 = Tk()
def valider(event):
pointsplus = 0
pointsmoins = 0
if rep.get()==question[4]:
pointsplus = pointsplus+2
champ_label7= Label(fenetre2, text="Bonne réponse!")
champ_label7.pack()
else:
pointsmoins = pointsmoins+2
champ_label7= Label(fenetre2, text="C'est pas ça...")
champ_label7.pack()
for question in questions:
champ_label4= Label(fenetre2, text=question[0])
champ_label4.pack()
choix1= Label(fenetre2, text=question[1])
choix1.pack()
choix2= Label(fenetre2, text=question[2])
choix2.pack()
choix3= Label(fenetre2, text=question[3])
choix3.pack()
rep = Entry(fenetre2, state="normal")
rep.pack()
rep.bind('<Return>', valider)
Bouton = Button(fenetre2,text = "Next",command = init)
Bouton.pack()
fenetre.mainloop()
R = pointsplus - pointsmoins
niveaux=[["20","Bravo"],
["16","Presque excellent"],
["12","Peut mieux faire"],
["10","C'est limite"],
["5","Rate"],
["2","Pourquoi as-tu fais ce test?"]]
for niveau in niveaux:
if R >= int(niveau[0]):
champ_label5= Label(fenetre2, text= R)
champ_label5.pack()
champ_label6= Label(fenetre2, text= niveau[1])
champ_label6.pack()
break
Il m'affiche bien la question, les 3 choix, la zone d'entrée mais ne change pas de page quand je fais entrée, il m'affiche juste le message qui spawn en dessous.
"Et l'organisation des questions est de toi Olygrim"
Ah bah sincèrement je ne m'en rappelais pas . Comme généralement les personnes ont tendance à complexifier cette partie, je trouvais ta démarche cool .
Bref, cessons de s'auto-congratuler. La méthode winfo_children() liste tous les enfants de ta fenêtre. Ainsi, au lieu de passer à tous tes enfants une méthode commune une par une, tu fais une boucle. C'est par exemple le cas quand je place mes objets avec la méthode pack().
Ma fonction suivant() permet d'afficher une question. La première étape c'est de regarder si la liste de questions est remplie (le if lst_qst est équivalent à if lst_qst != 0). Si c'est le cas, on utilise la méthode choice, qui est une méthode du module random (que j'ai importé au début du code). choice permet de prendre une sous-liste aléatoirement dans ta liste (et j'attribue le résultat à ma variable lot). Ensuite je supprime la sous-liste (pour ne pas reposer la même question).
La grande ligne du if dans suivant() est ce qu'on appelle de l'unpacking. Voici 2 liens pour essayer de comprendre: ici et là. Concrètement ça te permet de distribuer rapidement le contenu de la variable lot au bon objet. Une manière classique de faire serait:
Malheuresement plsu j'avance avec ces nouveaux concept, plus je galère à m'y retrouver dans mon programme >.<
Maintenant il ne m'affiche meme plus d'erreur, mais ne m'affiche pas de "fenetre2" non plus xS
# -*-coding:Latin-1 -*
from tkinter import *
from random import choice
fenetre = Tk()
champ_label1= Label(fenetre, text="Bienvenue dans notre QCM sur le B2i lycee, nous proposons une question par item, chaque item est range dans son domaine respectif.\nRappelons que pour valider le B2i, il faut valider les cinq domaines \nAttention ! Pour valider les cinq domaines, il faut valider au moins 80% du B2i en ayant 50% de bonne reponses minimum dans chaque domaine.\n")
champ_label1.pack()
champ_label2= Label(fenetre, text="Quel est votre nom ?")
champ_label2.pack()
var_texte = StringVar()
ligne_texte = Entry(fenetre, textvariable=var_texte, width=30)
ligne_texte.pack()
nomJoueur = var_texte.get()
champ_label3= Label(fenetre, text="Pret?"+nomJoueur+" Alors commencons !\n")
champ_label3.pack()
bouton_quitter = Button(fenetre, text="GOOOO!", command=fenetre.destroy)
bouton_quitter.pack()
fenetre.mainloop()
questions=[["\n1.Quelle est la signification du mot fichier ?\n" , "A.Il s\'agit du nom donne a un document enregistre a partir de l`ordinateur.\n","B.Un fichier peut contenir une image, du texte ecrit, ou meme du son.\n","C.Un fichier ne peut contenir que du texte\n ", "C"],
["\n2.Quelle est la signification du mot dossier ?\n" , "A.Il s\'agit du nom donne a un document enregistre uniquement sur une disquette.\n","B.Un dossier peut contenir plusieurs fichiers differents:Un fichier image, un fichier texte, ou meme un fichier son.\n","C.Un dossier ne peut contenir que du texte\n", "A"],
["\n3.Quelle est la bonne definition ?\n" , "A.La corbeille, C\'est un accessoire qui sert a trier un fichier.\n","B.Un icone, Il s\'agit d\'une petite image qui permet de realiser une action sur l`ordinateur ou d\'acceder a un logiciel.\n","C.Un dossier, C\'est le nom d`un seul fichier que l`on considere comme tres important\n","B"],
["\n4.Trois d\'entre eux ont une fonction identique : memoriser l\'information, Rechercher l\'intrus qui s\'est glisse dans cette liste\n", "A. Une disquette.\n","B. Le modem.\n","C. Le Cederom.\n", "B"],
["\n5.Un seul des quatre ne permet pas de saisir de l\'information. Lequel ?\n ", "A. Le microphone.\n","B. Le scanner.\n","C. Le moniteur\n", "C"],
["\n6.Qu\'est ce qu`un modem?\n", "A. Un modem est un compteur qui permet de relever le temps d`une conversation.\n","B. Un modem est un appareil qui permet l\'echange d\'informations entre des ordinateurs via les lignes telephoniques (voir reseaux informatiques). Le modem sert d\'intermediaire et permet de transformer le langage de l\'ordinateur pour que le message puisse se deplacer dans les fils du telephone.\n","C.Un modem est un boitier qui remplace la ligne de telephone\n","B"],
["\n7.Un seul correspond a la bonne definition et au bon usage de l\'imprimante. Lequel?\n", "A.Elle dispose d`un ruban enduit d\'encre qui permet d\'imprimer du texte ou des images. Il suffit de relier l\'imprimante a l\'ordinateur et a une prise de courant pour qu\'elle fonctionne.\n","B. Une imprimante dispose d\'une ou plusieurs cartouches d`encre. Lorsqu\'une cartouche est vide il convient de la changer (ou sur certains modeles de la remplir d\'encre.). Pour pouvoir fonctionner correctement une imprimante doit etre reconnu par l\'ordinateur au moment de son installation.\n","C.Une imprimante est un systeme qui permet d`envoyer et de recevoir des fichiers\n","B"],
["\n8.Pour enregistrer un travail sur une disquette...\n", "A. Je vais dans \"fichier \" et \"enregistrer sous \" et je selectionne le lecteur de disquettes A,\(ou il est ecrit \"enregistrer dans\" \).\n","B. J\'appelle mon fichier \"disquette A\".\n","C.Je fais un copier-coller sur le bureau pour enregistrer sur la disquette 'A'\n","A"],
["\n9.Quelle est la bonne procedure pour enregister un fichier ?\n", "A. Cliquer sur enregistrer et choisir le dossier dans la liste.\n","B. Cliquer sur 'Enregistrer sous ...' , et choisir le dossier dans la liste.\n","C.Copier le document , puis le coller dans le dossier de son choix\n","B"],
["\n10.Que signifie le sigle 'www' ?\n", "A. Waste Work Web.\n","B.Wild Wild West.\n","C.World Wide Web\n","C"]]
pointsplus = 0
pointsmoins = 0
fenetre2 = Tk()
def init():
for child in fenetre2.winfo_children():
child["state"] = "normal"
#Utilisation de la fonction suivant() pour afficher la 1ère question
suivant()
#Changement de la fonction associée à btn pour la suite et de son texte
Bouton["text"] = "Question suivante"
Bouton["command"] = exercice
def exercice(event):
for question in questions:
if question:
lot=choice(question)
question.remove(lot)
champ_label4= Label(fenetre2, text=question[0])
champ_label4.pack()
choix1= Label(fenetre2, text=question[1])
choix1.pack()
choix2= Label(fenetre2, text=question[2])
choix2.pack()
choix3= Label(fenetre2, text=question[3])
choix3.pack()
rep = Entry(fenetre2, state="normal")
rep.pack()
rep.bind('<Return>', valider)
champ_label4["text"], choix1["text"], choix2["text"], choix3["text"], rep = lot
Bouton = Button(fenetre2,text = "Next",command = init)
Bouton.pack()
fenetre.mainloop()
def valider(event):
if rep.get()==question[4]:
pointsplus = pointsplus+2
champ_label7= Label(fenetre2, text="Bonne réponse!")
champ_label7.pack()
return pointplus
else:
pointsmoins = pointsmoins+2
champ_label7= Label(fenetre2, text="C'est pas ça...")
champ_label7.pack()
return pointplus
R = pointsplus - pointsmoins
niveaux=[["20","Bravo"],
["16","Presque excellent"],
["12","Peut mieux faire"],
["10","C'est limite"],
["5","Rate"],
["2","Pourquoi as-tu fais ce test?"]]
for niveau in niveaux:
if R >= int(niveau[0]):
champ_label5= Label(fenetre2, text= R)
champ_label5.pack()
champ_label6= Label(fenetre2, text= niveau[1])
champ_label6.pack()
break
for child in fenetre2.winfo_children():
child.pack()
"Malheureusement plus j'avance avec ces nouveaux concept, plus je galère à m'y retrouver dans mon programme"
Justement ce que j'utilise ce ne sont pas des nouveaux concepts. Ce sont au contraire des concepts de base (à part l'unpacking ). Le reste c'est juste des fonctions et l'utilisation de variables muables .
Ton problème c'est que tu réfléchis de manière "classique", alors que ton programme va tourner dans une interface. Or dans une interface, ce sont les événements (entrée utilisateur, clic de souris, appuie sur un bouton, ....) qui font évoluer le code. Deux exemples: Lorsqu'une fonction est liée à un événement, on N'UTILISE PAS le mot-clé return. Il faut penser différemment. Faire en sorte que le résultat soit enregistrer directement dans une variable (d'où l'utilisation de variables muables), ou que le résultat soit directement affiché dans l'interface.
L'utilisation d'une variable muable est une astuce. Les variables muables (les listes, les dictionnaires, ...) sont des variables qui lorsqu'elles sont modifier, ne vont pas changer d'adresse mémoire. À l'opposé, on trouve les variables immuables (les chaînes de caractères, les tuples, les entiers, ....). Le problème des variables muables/immuables se rencontrent notamment dans les fonctions.
Les variables créées à l'intérieur d'une fonction, ont une portée d'utilisation restreinte. Elle ne sont accessibles que dans la fonction en elle-même. C'est ce qu'on appelle la portée lexicale. Ceci est vrai pour TOUTES les variables: immuables et muables. MAIS, et c'est là l'astuce, si ta variable a été créée à l'extérieur de ta fonction ET si ta variable est muable, alors tu pourra la modifier à l'intérieur de la fonction:
#Une chaine est immuable
chn = "Hello"
#Une liste est muable
lst = ["Goodbye"]
def changer_chn():
chn += " World"
def changer_lst():
lst[0] += " Deponia"
#Appel des fonctions:
changer_chn() #renvoie une erreur
changer_lst() #le travail est bien fait
print(lst)
D'habitude, on utilise le mot-clé return pour modifier PROPREMENT une variable:
def changer_chn():
#Ici je créé une nouvelle chaine à partir de la variable immuable.
#Mais je ne change pas celle-ci directement dans ma fonction
chaine = chn + " World"
return chaine
#Et j'associe ce que renvoie ma fonction à ma variable
chn = changer_chn()
print(chn)
MAIS, on ne peux pas utiliser le mot-clé return car on est maintenant dans une interface. Il faut donc ruser et utiliser les variables muables pour récupérer le résultat. C'est pour cela que dans le code que je t'ai donné, j'ai créé une variable ctrl (ctrl pour contrôle) qui est une liste et qui va avoir 2 éléments: la réponse en premier, et le score en deuxième. Mais au lieu d'enregistrer ton score dans la liste, tu peux directement afficher l'afficher dans un label (que tu aura appelé par exemple .....score ). Et donc tu utilises le paramètre text du label pour modifier "en live" dans ta fonction le texte: score["text"] = int(score["text"]) + 1. Une autre possibilité serait d'utiliser les variables tkinter (IntVar, StringVar, ...) mais leur utilisation est un peu plus complexe, et sont-elles simplement muables? À vérifier.
Le deuxième exemple pour un changement de réflexion quand on utilise une interface, c'est ton utilisation de la boucle for dans ta fonction exercice(). Il faut encore une fois PENSER DIFFÉREMMENT . Ce n'est plus la boucle qui va passer les questions à la suite des autres (et donc créer un ensemble complexe de boutons à chaque itération) MAIS une interaction avec l'utilisateur. J'ai décidé (mais on peux faire autrement) de lier ma fonction verif() à la touche Entrée (ligne 68 de mon code): rep.bind("<Return>", verif). Autrement dit, à chaque fois que l'utilisateur va appuyer sur la touche Entrée une fois sa réponse écrite (il faut qu'il appuie sur Entrée quand il est dans l'objet Entry que j'ai appelé ici rep), un petit message s'affiche, et je réactive le bouton pour passer à la question suivante.
Enfin, une dernière précision. Évite au maximum la création d'objet dans les fonctions (comme dans la fonction exercice()). Encore une fois à cause de la portée lexicale des variables. Le problème dans le cas de l'interface, c'est que tu pense que ces objets existent à l'extérieur car ils sont visibles dans ton interface. CE N'EST PAS LE CAS. Ils existent dans l'interface, mais si tu veux changer leur couleur, leur texte, ... tu ne pourra pas. SAUF, si tu utilise .......... une variable muable pour les stocker
Non ce ne sont pas de "nouveaux" concepts, mais ils sont nouveau pour moi x)
En essayant de suivre ton enseignement (sensei ), j'ai tout mis dans des fonctions et j'ai quasiment fais EXACTEMENT comme dans ton exemple >< (Quel imposteur je fais x[ )
Et pourtant...ma première fenetre s'affiche...je clique sur le "GOOOOO!!" et puis......RIEN DU TOUT D'x Je comprend absolument pas pk rien ne s'affiche =(
Je n'ai pas d'erreurs en retour, juste la console qui se ferme.
Je remet le code quand meme =( :
ctrl=["",0]
def init():
for child in fenetre2.winfo_children():
child["state"] = "normal"
exercice()
#Changement de la fonction associée à btn pour la suite et de son texte
Bouton["text"] = "Question suivante"
Bouton["command"] = exercice
def exercice():
if question:
lot=choice(question)
question.remove(lot)
laquestion["text"], choix1["text"], choix2["text"], choix3["text"], ctrl[0] = lot
Bouton["state"]="disabled"
else:
for child in fenetre2.winfo_children():
child["statut"]="disabled"
appreciation()
Bouton["state"] = "normal"
Bouton["text"] = "Quitter"
Bouton["command"] = fen.destroy
def valider(event):
if rep.get()==question[4]:
ctrl[1]=ctrl[1]+2
Message["text"]="Bonne réponse!"
else:
Message["text"]="C'est pas ça..."
Bouton["state"] = "normal"
Bouton["text"] = "Next"
Bouton["command"] = init
def appreciation():
niveaux=[["20","Bravo"],
["16","Presque excellent"],
["12","Peut mieux faire"],
["10","C'est limite"],
["5","Rate"],
["2","Pourquoi as-tu fais ce test?"]]
for niveau in niveaux:
if ctrl[1] >= int(niveau[0]):
Note= Label(fenetre2, text= R)
Message= Label(fenetre2, text= niveau[1])
fenetre2 = Tk()
laquestion= Label(fenetre2, text="")
choix1= Label(fenetre2, text="")
choix2= Label(fenetre2, text="")
choix3= Label(fenetre2, text="")
rep = Entry(fenetre2, state="normal")
rep.bind('<Return>', valider)
Message = Label(fenetre2, text="")
Note = Label(fenetre2, text="")
Bouton = Button(fenetre2,text = "",command = init)
for child in fenetre2.winfo_children():
child.pack()
Et je me pose la question si le problème viens pas du pc finalement prck meme le programme que tu m'as envoyé ne veut pas s'afficher
Alors déjà ton code est beaucoup plus dans l'esprit de la programmation événementielle .
Le problème peut venir de ta deuxième instance de Tk(). En tkinter, on ne doit jamais utiliser 2 instances de Tk(). Ta deuxième fenêtre devrait être une Toplevel().
Juste une dernière précision sur ce que j'ai dit précédemment. Quand on fait un programme non piloté par les événements (un code "classique"), les instructions s'exécutent les unes à la suite des autres. Même si tu peux créer des embranchements (avec des if, ...), l'exécution reste linéaire. Avec une interface c'est différent. Ça dépend totalement de ce que va faire l'utilisateur. Et donc cette programmation est surtout décomposer en fonctions, fonctions qui seront liés à des événements. Si tu regarde ton nouveau code, il y a une partie linéaire (la création de l'interface) et tout le reste est placé dans des fonctions. Et chaque action de l'utilisateur va appeler la fonction associée.
Mais pourquoi quand je veux appeler par exemple ma fonction "init()" juste après la création de ma première interface, afin donc de lancer la suite, il me dit qu'elle n'existe pas. J'aurai voulu que mon bouton "GOO" lance la suite =(
Une fonction déclarée dans un programme n'a-t-elle pas une portée globale ?
Ah ducoup tout les "child" que je met dans ma boucle avec le winfo_children() appartiennent à la deuxième fenetre ?
Comment je fais pour appeler le init() une première fois alors? Maintenant, avec le mainloop de la fenetre 2 (merci fauquette), j'ai 2 fenetre qui s'affichent mais avec rien dedans =(
# -*-coding:Latin-1 -*
from tkinter import *
from random import choice
#fenetre = Tk()
#champ_label1= Label(fenetre, text="Bienvenue dans notre QCM sur le B2i lycee, nous proposons une question par item, chaque item est range dans son domaine respectif.\nRappelons que pour valider le B2i, il faut valider les cinq domaines \nAttention ! Pour valider les cinq domaines, il faut valider au moins 80% du B2i en ayant 50% de bonne reponses minimum dans chaque domaine.\n")
#champ_label1.pack()
#champ_label2= Label(fenetre, text="Quel est votre nom ?")
#champ_label2.pack()
#var_texte = StringVar()
#ligne_texte = Entry(fenetre, textvariable=var_texte, width=30)
#ligne_texte.pack()
#nomJoueur = var_texte.get()
#champ_label3= Label(fenetre, text="Pret?"+nomJoueur+" Alors commencons !\n")
#champ_label3.pack()
#bouton_quitter = Button(fenetre, text="GOOOO!", command=fenetre.destroy)
#bouton_quitter.pack()
#fenetre.mainloop()
questions=[["\n1.Quelle est la signification du mot fichier ?\n" , "A.Il s\'agit du nom donne a un document enregistre a partir de l`ordinateur.\n","B.Un fichier peut contenir une image, du texte ecrit, ou meme du son.\n","C.Un fichier ne peut contenir que du texte\n ", "C"],
["\n2.Quelle est la signification du mot dossier ?\n" , "A.Il s\'agit du nom donne a un document enregistre uniquement sur une disquette.\n","B.Un dossier peut contenir plusieurs fichiers differents:Un fichier image, un fichier texte, ou meme un fichier son.\n","C.Un dossier ne peut contenir que du texte\n", "A"],
["\n3.Quelle est la bonne definition ?\n" , "A.La corbeille, C\'est un accessoire qui sert a trier un fichier.\n","B.Un icone, Il s\'agit d\'une petite image qui permet de realiser une action sur l`ordinateur ou d\'acceder a un logiciel.\n","C.Un dossier, C\'est le nom d`un seul fichier que l`on considere comme tres important\n","B"],
["\n4.Trois d\'entre eux ont une fonction identique : memoriser l\'information, Rechercher l\'intrus qui s\'est glisse dans cette liste\n", "A. Une disquette.\n","B. Le modem.\n","C. Le Cederom.\n", "B"],
["\n5.Un seul des quatre ne permet pas de saisir de l\'information. Lequel ?\n ", "A. Le microphone.\n","B. Le scanner.\n","C. Le moniteur\n", "C"],
["\n6.Qu\'est ce qu`un modem?\n", "A. Un modem est un compteur qui permet de relever le temps d`une conversation.\n","B. Un modem est un appareil qui permet l\'echange d\'informations entre des ordinateurs via les lignes telephoniques (voir reseaux informatiques). Le modem sert d\'intermediaire et permet de transformer le langage de l\'ordinateur pour que le message puisse se deplacer dans les fils du telephone.\n","C.Un modem est un boitier qui remplace la ligne de telephone\n","B"],
["\n7.Un seul correspond a la bonne definition et au bon usage de l\'imprimante. Lequel?\n", "A.Elle dispose d`un ruban enduit d\'encre qui permet d\'imprimer du texte ou des images. Il suffit de relier l\'imprimante a l\'ordinateur et a une prise de courant pour qu\'elle fonctionne.\n","B. Une imprimante dispose d\'une ou plusieurs cartouches d`encre. Lorsqu\'une cartouche est vide il convient de la changer (ou sur certains modeles de la remplir d\'encre.). Pour pouvoir fonctionner correctement une imprimante doit etre reconnu par l\'ordinateur au moment de son installation.\n","C.Une imprimante est un systeme qui permet d`envoyer et de recevoir des fichiers\n","B"],
["\n8.Pour enregistrer un travail sur une disquette...\n", "A. Je vais dans \"fichier \" et \"enregistrer sous \" et je selectionne le lecteur de disquettes A,\(ou il est ecrit \"enregistrer dans\" \).\n","B. J\'appelle mon fichier \"disquette A\".\n","C.Je fais un copier-coller sur le bureau pour enregistrer sur la disquette 'A'\n","A"],
["\n9.Quelle est la bonne procedure pour enregister un fichier ?\n", "A. Cliquer sur enregistrer et choisir le dossier dans la liste.\n","B. Cliquer sur 'Enregistrer sous ...' , et choisir le dossier dans la liste.\n","C.Copier le document , puis le coller dans le dossier de son choix\n","B"],
["\n10.Que signifie le sigle 'www' ?\n", "A. Waste Work Web.\n","B.Wild Wild West.\n","C.World Wide Web\n","C"]]
ctrl=["",0]
def init():
for child in fenetre2.winfo_children():
child["state"] = "normal"
exercice()
#Changement de la fonction associée à btn pour la suite et de son texte
Bouton["text"] = "Question suivante"
Bouton["command"] = exercice
def exercice():
if questions:
lot=choice(questions)
questions.remove(lot)
laquestion["text"], choix1["text"], choix2["text"], choix3["text"], ctrl[0] = lot
Bouton["state"]="disabled"
else:
for child in fenetre2.winfo_children():
child["statut"]="disabled"
appreciation()
Bouton["state"] = "normal"
Bouton["text"] = "Quitter"
Bouton["command"] = fen.destroy
def valider(event):
if rep.get()==questions[4]:
ctrl[1]=ctrl[1]+2
Message["text"]="Bonne réponse!"
else:
Message["text"]="C'est pas ça..."
Bouton["state"] = "normal"
Bouton["text"] = "Next"
Bouton["command"] = init
def appreciation():
niveaux=[["20","Bravo"],
["16","Presque excellent"],
["12","Peut mieux faire"],
["10","C'est limite"],
["5","Rate"],
["2","Pourquoi as-tu fais ce test?"]]
for niveau in niveaux:
if ctrl[1] >= int(niveau[0]):
Note= Label(fenetre2, text= R)
Message= Label(fenetre2, text= niveau[1])
fenetre2 = Toplevel()
laquestion= Label(fenetre2, text="")
choix1= Label(fenetre2, text="")
choix2= Label(fenetre2, text="")
choix3= Label(fenetre2, text="")
rep = Entry(fenetre2, state="normal")
rep.bind('<Return>', valider)
Message = Label(fenetre2, text="")
Note = Label(fenetre2, text="")
Bouton = Button(fenetre2,text = "",command = init)
fenetre2.mainloop()
for child in fenetre2.winfo_children():
child.pack()
J'ai mis le début en commentaire pour juste essayer de faire marcher au moins une première fenetre x'(
Ça fonctionne si tu utilise la méthode mainloop() après avoir placé tes objets :
for child in fenetre2.winfo_children():
child.pack()
fenetre2.mainloop()
Sinon, pour ton objet Bouton, il faudrait mettre un petit texte. Mais teste ton code en entier en changeant juste la place de ton mainloop() tu verra bien
Alors petite rectification: puisque tu détruit ta première fenêtre, ta deuxième doit être un objet Tk(). Sinon tu as 2 fenêtres qui s'ouvrent.
PS: dans ton code il y a une erreur (parce que je n'avais jamais la bonne réponse ). Dans ta fonction valider() ce n'est pas à questions[4] auquel il faut comparer l'entrée utilisateur mais ctrl[0]:
Les Questions s’enchaînent, il faut que j'arrive à rafraîchir l'Entry et le Label qui dit "Bonne réponse" et "C'est pas ça..." peut etre aussi faire des fonctions de vérifications de ce que l'utilisateur rentre mais je vais essayer au moins de faire ça tout seul >.< (sa en fera au moins une partie ^^")
Une fois les questions finies cependant, il ferme l'interface et m'affiche cette erreur dans la console :
Une petite idée de ce que ça veut dire ? =S
Un problème avec ma fonction "appreciation" non?
Mais déjà un I-M-M-E-N-S-E merci Olygrim pour toute ton aide =D
Ça je l'avais vu depuis longtemps ce petit souci . La première chose c'est d'inverser l'ordre des éléments, i.e. mettre la mauvaise appréciation en premier. Ensuite de mettre les notes en .... nombre directement . Et enfin, de ne pas mettre l'affichage à chaque itération (mais en sortie):
niveaux=[[2, "Pourquoi as-tu fais ce test?"],
[5, "Rate"],
[10, "C'est limite"],
[12, "Peut mieux faire"],
[16,"Presque excellent"],
[20,"Bravo"]]
for niveau in niveaux:
if ctrl[1] >= niveau[0]:
msg = niveau[1]
#Affichage en dehors de la boucle
Label(fenetre3, text= ctrl[1]).pack()
Label(fenetre3, text= msg).pack()
PS: puisque tu créé des objets dans une fonction, les nommer n'a pas d'intérêt. Tu peux de suite utiliser la méthode pack()
Bon il faut que je travail sur ma logique un peu quand même parce-que j'arrive pas à faire des trucs que je trouve évident unf ois sous les yeux c'est lourd x(
Encore merci Olygrim, je ne serai rien sans toi =D
Bonne continuation, sujet résolu =)
Le code une dernière fois en entier pour ceux qui ont besoin:
# -*-coding:Latin-1 -*
from tkinter import *
from random import choice
fenetre = Tk()
champ_label1= Label(fenetre, text="Bienvenue dans notre QCM sur le B2i lycee, nous proposons une question par item, chaque item est range dans son domaine respectif.\nRappelons que pour valider le B2i, il faut valider les cinq domaines \nAttention ! Pour valider les cinq domaines, il faut valider au moins 80% du B2i en ayant 50% de bonne reponses minimum dans chaque domaine.\n")
champ_label1.pack()
champ_label2= Label(fenetre, text="Quel est votre nom ?")
champ_label2.pack()
var_texte = StringVar()
ligne_texte = Entry(fenetre, textvariable=var_texte, width=30)
ligne_texte.pack()
nomJoueur = var_texte.get()
champ_label3= Label(fenetre, text="Pret?"+nomJoueur+" Alors commencons !\n")
champ_label3.pack()
bouton_quitter = Button(fenetre, text="GOOOO!", command=fenetre.destroy)
bouton_quitter.pack()
fenetre.mainloop()
questions=[["\nQuelle est la signification du mot fichier ?\n" , "A.Il s\'agit du nom donne a un document enregistre a partir de l`ordinateur.\n","B.Un fichier peut contenir une image, du texte ecrit, ou meme du son.\n","C.Un fichier ne peut contenir que du texte\n ", "C"],
["\nQuelle est la signification du mot dossier ?\n" , "A.Il s\'agit du nom donne a un document enregistre uniquement sur une disquette.\n","B.Un dossier peut contenir plusieurs fichiers differents:Un fichier image, un fichier texte, ou meme un fichier son.\n","C.Un dossier ne peut contenir que du texte\n", "A"],
["\nQuelle est la bonne definition ?\n" , "A.La corbeille, C\'est un accessoire qui sert a trier un fichier.\n","B.Un icone, Il s\'agit d\'une petite image qui permet de realiser une action sur l`ordinateur ou d\'acceder a un logiciel.\n","C.Un dossier, C\'est le nom d`un seul fichier que l`on considere comme tres important\n","B"],
["\nTrois d\'entre eux ont une fonction identique : memoriser l\'information, Rechercher l\'intrus qui s\'est glisse dans cette liste\n", "A. Une disquette.\n","B. Le modem.\n","C. Le Cederom.\n", "B"],
["\nUn seul des quatre ne permet pas de saisir de l\'information. Lequel ?\n ", "A. Le microphone.\n","B. Le scanner.\n","C. Le moniteur\n", "C"],
["\nQu\'est ce qu`un modem?\n", "A. Un modem est un compteur qui permet de relever le temps d`une conversation.\n","B. Un modem est un appareil qui permet l\'echange d\'informations entre des ordinateurs via les lignes telephoniques (voir reseaux informatiques). Le modem sert d\'intermediaire et permet de transformer le langage de l\'ordinateur pour que le message puisse se deplacer dans les fils du telephone.\n","C.Un modem est un boitier qui remplace la ligne de telephone\n","B"],
["\nUn seul correspond a la bonne definition et au bon usage de l\'imprimante. Lequel?\n", "A.Elle dispose d`un ruban enduit d\'encre qui permet d\'imprimer du texte ou des images. Il suffit de relier l\'imprimante a l\'ordinateur et a une prise de courant pour qu\'elle fonctionne.\n","B. Une imprimante dispose d\'une ou plusieurs cartouches d`encre. Lorsqu\'une cartouche est vide il convient de la changer (ou sur certains modeles de la remplir d\'encre.). Pour pouvoir fonctionner correctement une imprimante doit etre reconnu par l\'ordinateur au moment de son installation.\n","C.Une imprimante est un systeme qui permet d`envoyer et de recevoir des fichiers\n","B"],
["\nPour enregistrer un travail sur une disquette...\n", "A. Je vais dans \"fichier \" et \"enregistrer sous \" et je selectionne le lecteur de disquettes A,\(ou il est ecrit \"enregistrer dans\" \).\n","B. J\'appelle mon fichier \"disquette A\".\n","C.Je fais un copier-coller sur le bureau pour enregistrer sur la disquette 'A'\n","A"],
["\nQuelle est la bonne procedure pour enregister un fichier ?\n", "A. Cliquer sur enregistrer et choisir le dossier dans la liste.\n","B. Cliquer sur 'Enregistrer sous ...' , et choisir le dossier dans la liste.\n","C.Copier le document , puis le coller dans le dossier de son choix\n","B"],
["\nQue signifie le sigle 'www' ?\n", "A. Waste Work Web.\n","B.Wild Wild West.\n","C.World Wide Web\n","C"]]
ctrl=["",0]
def init():
for child in fenetre2.winfo_children():
child["state"] = "normal"
exercice()
#Changement de la fonction associée à btn pour la suite et de son texte
#Bouton2["state"] = "disabled"
Bouton["text"] = "Question suivante"
Bouton["state"] = "disabled"
def exercice():
if questions:
lot=choice(questions)
questions.remove(lot)
laquestion["text"], choix1["text"], choix2["text"], choix3["text"], ctrl[0] = lot
Bouton["state"]="disabled"
else:
for child in fenetre2.winfo_children():
child["state"] = "disabled"
Bouton2["state"] = "normal"
Bouton2["text"] = "Terminer"
def valider(event):
if rep.get()==ctrl[0]:
ctrl[1]=ctrl[1]+2
Message["text"]="Bonne réponse!"
else:
Message["text"]="C'est pas ça..."
Bouton["state"] = "normal"
Bouton["text"] = "Question suivante"
Bouton["command"] = init
def appreciation():
fenetre3 = Tk()
fenetre3.geometry("800x300+300+0")
niveaux=[["2","Pourquoi as-tu fais ce test?"],
["5","Rate"],
["10","C'est limite"],
["12","Peut mieux faire"],
["16","Presque excellent"],
["20","Bravo"]]
for niveau in niveaux:
if ctrl[1] >= int(niveau[0]):
app=niveau[1]
Note= Label(fenetre3, text= ctrl[1]).pack()
Message= Label(fenetre3, text= app).pack()
fenetre3.mainloop()
fenetre2 = Tk()
fenetre2.geometry("800x300+300+0")
laquestion= Label(fenetre2, text="")
choix1= Label(fenetre2, text="")
choix2= Label(fenetre2, text="")
choix3= Label(fenetre2, text="")
rep = Entry(fenetre2, state="disabled")
rep.bind('<Return>', valider)
Message = Label(fenetre2, text="")
Note = Label(fenetre2, text="")
Bouton = Button(fenetre2,text = "Start",command = init)
Bouton2 = Button(fenetre2,text = "Terminer",command = appreciation, state= "disabled")
for child in fenetre2.winfo_children():
child.pack()
fenetre2.mainloop()
QCM dans une interface
× 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.
J'ai mis le début en commentaire pour juste essayer de faire marcher au moins une première fenetre x'(