Menu

Affichage d'une image et coder les réponses d'un qcm [Résolu]

Messages postés
2
Date d'inscription
mardi 2 avril 2019
Statut
Membre
Dernière intervention
15 mai 2019
- - Dernière réponse : quent217
Messages postés
326
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
6 mai 2019
- 25 avril 2019 à 19:02
Bonjour,

Je débute sur python (et Tkinter) et j'aimerais coder un qcm avec une interface graphique correcte. Je souhaiterais donc faire apparaître une image à chacune des questions de mon qcm.
Mon problème est le suivant : l'image du menu principal est correctement affichée, mais l'image de la question d'histoire n'apparaît pas (sauf lorsque je donne une valeur négative à "pady").

De plus j'aimerais associer à chaque bouton, une commande qui permettrait de savoir si la réponse est vrai ou fausse ( ex: si on clique sur le bouton 2, la réponse est fausse), mais je ne sais pas vraiment comment le faire .
Merci de votre aide !


from tkinter import *
from tkinter.messagebox import *
fenetre = Tk()
bon = 0
faux = 0


def H():
Fenetre= Tk()

#Photo Q1
Frame1 = Frame(Fenetre, borderwidth=5, relief=GROOVE)
Frame1.pack(side=TOP, padx=10, pady=10)
photo1 = PhotoImage(master= Fenetre, file="Libération.gif")
Label(Frame1, bg = "white", image=photo1).pack(padx=10, pady=10)

encadrement1 = LabelFrame(Frame1, text="Sélectionnez une réponse", padx=20, pady=20)
encadrement1.pack(fill="both", expand="yes")

#Q1
Label(encadrement1, text="La Deuxième guerre Mondiale eu lieu entre :").pack()
#Premier bouton
Bouton1 = Button(encadrement1, text = "1939-1945", command = oui)
Bouton1.pack(fill = "both", expand = "yes")
#Deuxième bouton
Bouton2 = Button(encadrement1, text = "1914-1918")
Bouton2.pack(fill = "both", expand = "yes")
#Troisième bouton
Bouton3 = Button(encadrement1, text = "1939-1954")
Bouton3.pack( fill = "both", expand = "yes")
#4ème bouton
Bouton4 = Button(encadrement1, text = "Menu principal", command= Fenetre.destroy)
Bouton4.pack(pady = 20)



#Interaface graphique
photo=PhotoImage(master = fenetre, file="photomenu.gif")

Frame1 = Frame(fenetre, bg="white", borderwidth=5, relief=GROOVE)
Frame1.pack(side=TOP, padx=10, pady=10)

Label(Frame1, text="Questionnaire de culture générale",bg="white", image=photo).pack(padx=10, pady=10)

encadrement = LabelFrame(Frame1, text="Jouer", padx=20, pady=20)
encadrement.pack(fill="both", expand="yes")

Label(encadrement, text="Sélectionnez une matière").pack()



#Boutons

bouton3= Button(encadrement,bg="white", text="Histoire", command= H)
bouton3.pack(pady= 0,expand ="yes", fill= "both")
bouton4 = Button(fenetre, bg="white", text="Quitter", command = fenetre.destroy)
bouton4.pack(side= BOTTOM, pady = 10)

encadrement.mainloop()

Frame1.mainloop()

fenetre.mainloop()
Afficher la suite 

1 réponse

Messages postés
326
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
6 mai 2019
76
0
Merci
Bonjour,
merci de spécifier le langage utilisé dans les balises de code (explications ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code) car sinon les indentations ne sont pas conservées et j'ai mis un peu de temps à retrouver jusque où va la fonction H.

Pour que l'image s'affiche correctement, il faut rajouter
Fenetre.mainloop()
à la fin de la fonction H. Je ne sais pas vraiment pourquoi l'image est le seul élément qui ne s'affiche pas mais cela permet de dire à Tkinter d'actualiser correctement l'affichage.

Pour savoir si la réponse est correcte, il faut déjà associer une fonction à chaque bouton avec l'attribut command comme vous avez fait à certains endroits.
Ensuite il y a 3 possibilités :
Soit vous créez une fonction par bouton, mais ce n'est clairement pas une solution propre.
Soit vous créez une fonction correcte et une fonction incorrecte et vous associez à chaque bouton la fonction correspondante. Inconvénients :
- Vous savez uniquement si la réponse est correcte ou non sans savoir quelle réponse a été séléctionnée
- La bonne réponse est codé en dur dans le code et vous ne pouvez pas aller chercher l'information dans un fichier par exemple.
Dernière solution : vous mettez un argument dans la fonction
def verif(idBouton):
et dans le bouton vous mettez
command = lambda:verif(1)
et le 1 est remplacé par une valeur différente pour chaque bouton, ce qui permet de les différencier une fois dans la fonction verif.
Commenter la réponse de quent217