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.
"L'urgent est fait; l'impossible est en cours; pour les miracles, prévoir un délai."
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 ?
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
"L'urgent est fait; l'impossible est en cours; pour les miracles, prévoir un délai."
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.
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
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.
"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.