Problème avec Tkinter ,fonctions

Fermé
leblogueur - 23 oct. 2020 à 11:27
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 23 oct. 2020 à 15:49
Bonjour,

je débute un peu en python et j'ai créé un jeu de mathématique et j'aimerais l'adapter graphiquement

le code du jeu non graphique:
operation = "l"
dificulter = 5
score = 0
vie = 3
bonus = 0
reponse = None
print("Bonjour ! Voici un petit jeu de calcul mental. A toi de jouer !")
print()
while vie>0:
    import random
    print("Réalise ce petit calcul :")
    print()
    choice_operation = random.randint(1, 5)
    if choice_operation == 1 or choice_operation == 2 :
      operation = "+"
    if choice_operation == 3 or choice_operation == 4 :
      operation = "-"
    if choice_operation == 5 :
      operation = "*"
    if operation == "*" or operation == "+" or operation == "-":
        A = random.randint(0, dificulter)
        B = random.randint(0, dificulter)
    print (A, operation, B)
    reponse = int(input())
    if operation == "+" :
      bonne_reponse = A + B
    if operation == "-" :
        bonne_reponse = A - B
    if operation == "*" :
      bonne_reponse = A * B
    if reponse == bonne_reponse :
      print ("Bravo !")
      dificulter += 1
      score += 10
      bonus += 1
      print ("Tu as", score, "points")
      if bonus == 10 :
          print("Bravo ! Tu as réussi à faire", bonus, "calculs sans te tromper !")
          choix_bonus = int(input("Souhaites-tu gagner une vie supplémentaire ou échanger cette vie contre des points ? (1) ou (2) :"))
          if choix_bonus == 1:
            bonus = 0
            vie += 1
            print("Bravo ! Tu as maintenant", vie, "vies")
          elif choix_bonus == 2:
            bonus = 0
            score += 20
            print("Bravo ! Tu as maintenant", score, "points")
    if score == 199:
        choix_challenge = int(input("Nouvelle étape ! Souhaites-tu rentrer dans le mode challenge ? (1)oui ou (2) non :"))
        if choix_challenge == 1:
            print("Mode challenge activé ! Tu n'as plus qu'une vie...")
            vie = 1
            dificulter += 10
            if bonus == 15:
                vie += 1
                bonus = 0
                print("Tu as maintenant", vie, "vies")
        elif choix_challenge == 2:
            print("Tu peux continuer de jouer normalement")
        else:
            print("Tu peux continuer de jouer normalement")
    elif reponse != bonne_reponse:
      vie -= 1
      bonus = 0
      print ("Il te reste", vie, "vies et la bonne réponse était", bonne_reponse )
      if vie == 0 :
        print ("Tu as perdu...")
        print ("Tu as", score, "points")
        score = 0
        bonus = 0
        dificulter = 5
        reponse = input ("""si tu veut rejouer tape "oui" : """)
        if reponse == "oui":
            vie = 3

et donc je n'arrive pas à faire une interface graphique fonctionnelle

le code de ce que j'ai "commencé" pour le jeu avec une interface graphique:
from tkinter import *
import random
 
operation = "l"
dificulter = 5
score = 0
vie = 3
bonus = 0
 
def calcul_generator():
    choice_operation = random.randint(1, 5)
    if choice_operation == 1 or choice_operation == 2 :
      operation = "+"
    if choice_operation == 3 or choice_operation == 4 :
      operation = "-"
    if choice_operation == 5 :
      operation = "*"
    if operation == "*" or operation == "+" or operation == "-":
        A = random.randint(0, dificulter)
        B = random.randint(0, dificulter)
        calcul = A, operation, B
        calcul_text.config(text=calcul, font=("Helvetica", 20), bg="#E9EA81", fg="#223E44")
    else:
        print("mince")
 
def calcul_verif():
    calcul_generator()
    global vie
    global bonne_reponse
    if operation == "+" :
      bonne_reponse = A + B
    if operation == "-" :
        bonne_reponse = A - B
    if operation == "*" :
      bonne_reponse = A * B                         
    if calcul_entry  == bonne_reponse :         
        label_title.config(text="bravo", font=("Helvetica", 20), bg="#E9EA81", fg="#223E44")
    elif calcul_entry != bonne_reponse:
        vie -= 1
        msg_tromper = ("dommage la réponse était", bonne_reponse, "et tu as", vie, "vies")
        label_title.config(text=msg_tromper, font=("Helvetica", 20), bg="#E9EA81", fg="#223E44")
         
         
window = Tk()
 
window.title("jeu math")
window.geometry("720x480")
window.minsize(620, 400)
window.config(background='#4065A4')
 
frame =Frame(window, bg='#4065A4')
 
width = 300
height = 300
image = PhotoImage(file="img_math.png").zoom(11).subsample(20)
canvas = Canvas(frame, width=width, height=height, bg='#4065A4', bd=0, highlightthickness=0)
canvas.create_image(width/2, height/2, image=image)
canvas.grid(row=0, column=0, sticky=W)
 
right_frame = Frame(frame, bg='#4065A4')
 
label_title = Label(right_frame, text="", font=("Helvetica", 20), bg='#4065A4', fg='white')
label_title.pack()
 
                             
calcul_text = Label(right_frame, text="0 + 0", font=("Helvetica", 20), bg="#E9EA81", fg="#223E44")
calcul_text.pack()
 
 
calcul_entry = Entry(right_frame, text="", font=("Helvetica", 20), bg='#4065A4', fg='white')
calcul_entry.pack()
 
generate_calcul = Button(right_frame, text="valider", font=("Helvetica", 20), bg="#4065A4", fg="#223E44",  command=calcul_verif)
generate_calcul.pack()
 
right_frame.grid(row=0, column=2, sticky=W)
 
frame.pack(expand=YES)
 
window.mainloop()

et voici le message d'erreur quand je clique sur valider:

    if calcul_entry  == bonne_reponse :
NameError: name 'bonne_reponse' is not defined

si vous savez comment l'améliorer et puis désolé si mon erreur est bête je suis tète en l'air

et désolé si tout est faut mais bon...



Configuration: Windows / Chrome 86.0.4240.75

3 réponses

Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 23 oct. 2020 à 12:03
Bonjour leblogueur,

Normal : operation est locale a la fonction calcul_generator donc inconnue dans calcul_verif
idem pour A et B

problème ici:
calcul = A, operation, B

du coup, quand on répond bien, on a un message "dommage la réponse était ..."

Pour récupérer le contenu de la réponse dans calcul_entry, il ne suffit pas d'écrire
if calcul_entry  == bonne_reponse :  

mais
if calcul_entry.get()  == bonne_reponse :  

Au fait, il faut écrire difficulte et pas dificulter


Sinon, tu peux simplifier le choix de l'opération comme ceci:
op = ['+', '-', '*']
operation = random.choice(op)

0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 23 oct. 2020 à 12:12
il y a aussi un problème de logique:

tu initialise calcul_text avec : "0+0"

donc on répond 0 et on valide

et le bouton valider déclenche l'initialisation du calcul a afficher, mais trop tard, on a répondu 0, donc erreur
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
23 oct. 2020 à 15:49
en gros, il faudrait faire ça:
from tkinter import *
import random

difficulte = 5
score = 0
vie = 3
bonus = 0

def calcul_generateur():
    global bonne_reponse

    #On efface les boites
    calcul_entry.delete(0,END)
    label_msg.config(text='')

    op = ['+', '-', '*']
    operation = random.choice(op)

    A = random.randint(0, difficulte)
    B = random.randint(0, difficulte)

    calcul = str(A)+operation+str(B)
    bonne_reponse = eval(calcul)

    #Affichage du calcul
    calcul_text.config(text=calcul)

def calcul_verif():

    global vie, bonne_reponse

    if(int(calcul_entry.get()) == bonne_reponse):         
        label_msg.config(text="Bravo !")
    else:
        vie -= 1
        msg_erreur = "Erreur : {}  Vie : {}".format(str(bonne_reponse), vie)
        label_msg.config(text=msg_erreur)

window = Tk()
window.title("Jeu mathématique")
window.geometry("400x200")
window.minsize(300, 200)
window.config(background='#4065A4')

label_msg = Label(window, width = '20', font=("Helvetica", 15))
label_msg.place(x=100, y=10)

calcul_text = Label(window, width = '20', font=("Helvetica", 15))
calcul_text.place(x=100, y=50)

calcul_entry = Entry(window, font=("Helvetica", 15))
calcul_entry.place(x=100, y=100)
calcul_entry.focus()

generate_calcul = Button(window, text="Afficher un calcul", font=("Helvetica", 11),  command=calcul_generateur)
generate_calcul.place(x=100, y=150)

verif_calcul = Button(window, text="Valider", font=("Helvetica", 11),  command=calcul_verif)
verif_calcul.place(x=250, y=150)

window.mainloop()
0