A voir également:
- Répéter ma fonction un certain nombre de fois
- Fonction si et - Guide
- Signe fois clavier iphone ✓ - Forum Word
- Signe fois ✓ - Forum Windows
- Ou trouvé la touche multiplié??? ✓ - Forum Clavier
- En raison d'un nombre important d'échec de connexion snapchat - Forum Snapchat
5 réponses
Bonjour.
Où est censé être dans ton code cette série de 10 calculs ?
Tu utilises une interface graphique, donc cela implique de faire agir l'utilisateur.
Les grandes lignes de ton interface devraient-être :
1 - Affichage d'une opération.
2 - Attente de la saisie du résultat par l'utilisateur.
3 - Si nombre d'opérations effectuées est de 10 => afficher un bouton "voir résultats"
.... Sinon, afficher un bouton "suivant' pour l'opération suivante.
Où est censé être dans ton code cette série de 10 calculs ?
Tu utilises une interface graphique, donc cela implique de faire agir l'utilisateur.
Les grandes lignes de ton interface devraient-être :
1 - Affichage d'une opération.
2 - Attente de la saisie du résultat par l'utilisateur.
3 - Si nombre d'opérations effectuées est de 10 => afficher un bouton "voir résultats"
.... Sinon, afficher un bouton "suivant' pour l'opération suivante.
Utilisateur anonyme
Modifié le 1 janv. 2019 à 20:45
Modifié le 1 janv. 2019 à 20:45
Boujour,
Je n'ai pas réussi à faire apparaître les boutons j'ai donc essayé de mettre un compteur dans ma fonction mais elle ne s'arrête toujours pas.
Pouvez-vous me dire le problème dans mon code svp ?
Je n'ai pas réussi à faire apparaître les boutons j'ai donc essayé de mettre un compteur dans ma fonction mais elle ne s'arrête toujours pas.
Pouvez-vous me dire le problème dans mon code svp ?
def addition (): def question() : nb=0 global resultat signe = ("+") chiffre1 = randint(0,99) chiffre2 = randint(0,99) calcul = (chiffre1, signe, chiffre2, ("=")) resultat = chiffre1 + chiffre2 resultat = str(resultat) affichageoperation = Label(fenetre, text= calcul) affichageoperation.pack() global entree value = StringVar() value.set("" ) entree = Entry(fenetre, textvariable=value, width=30) entree.pack() if nb<=10: entree.bind("<Return>", reponse) nb=nb+1 else : entree.bind("<Return>", fin) def fin (): print = Label(fenetre, text = "FIN", bg = "green" ) def reponse(chiffre): reponse = str(entree.get()) if reponse == resultat : print = Label(fenetre, text = "BRAVO", bg = "green" ) print.pack() else : print = Label(fenetre, text = "MAUVAIS", bg = "red" ) print.pack() question() fenetre = Tk() fenetre.geometry("400x700") fenetre.title("ADDITIONS") text1= Label(fenetre,text="Quelques additions...") text1.pack() question ()
Reivax962
Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
31 déc. 2018 à 14:35
31 déc. 2018 à 14:35
Bonjour,
Cela ne s'arrête jamais car à chaque fois que la fonction question() est appelée, nb est remis à 0.
Tu peux par exemple t'en sortir en faisant en sorte que ce ne soit pas question() qui définisse la valeur de nb, mais qu'elle soit une variable globale, comme "resultat".
Xavier
Cela ne s'arrête jamais car à chaque fois que la fonction question() est appelée, nb est remis à 0.
Tu peux par exemple t'en sortir en faisant en sorte que ce ne soit pas question() qui définisse la valeur de nb, mais qu'elle soit une variable globale, comme "resultat".
Xavier
Utilisateur anonyme
Modifié le 1 janv. 2019 à 20:46
Modifié le 1 janv. 2019 à 20:46
Bonsoir,
j'ai essayé d'insérer une variable globale à ma fonction pour que nb ne reparte pas tout le temps à 0 mais cela ne marche toujours pas. Pourriez vous m'expliquer pourquoi ?
j'ai essayé d'insérer une variable globale à ma fonction pour que nb ne reparte pas tout le temps à 0 mais cela ne marche toujours pas. Pourriez vous m'expliquer pourquoi ?
nb=0 def addition (): def question() : global resultat signe = ("+") chiffre1 = randint(0,99) chiffre2 = randint(0,99) calcul = (chiffre1, signe, chiffre2, ("=")) resultat = chiffre1 + chiffre2 resultat = str(resultat) affichageoperation = Label(fenetre, text= calcul) affichageoperation.pack() global entree value = StringVar() value.set("" ) entree = Entry(fenetre, textvariable=value, width=30) entree.pack() if nb==0: entree.bind("<Return>", reponse) global nb nb=nb+1 else : entree.bind("<Return>", fin) def fin (chiffre): print = Label(fenetre, text = "FIN", bg = "green" ) def reponse(chiffre): reponse = str(entree.get()) if reponse == resultat : print = Label(fenetre, text = "BRAVO", bg = "green" ) print.pack() else : print = Label(fenetre, text = "MAUVAIS", bg = "red" ) print.pack() question() fenetre = Tk() fenetre.geometry("400x700") fenetre.title("ADDITIONS") text1= Label(fenetre,text="Quelques additions...") text1.pack() question ()
Reivax962
Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
2 janv. 2019 à 10:09
2 janv. 2019 à 10:09
Bonjour,
Je ne sais pas vraiment coder en Python, mais il ne faudrait pas déclarer ta variable comme pour « resultat », avec « global nb » ?
Xavier
Je ne sais pas vraiment coder en Python, mais il ne faudrait pas déclarer ta variable comme pour « resultat », avec « global nb » ?
Xavier
Reivax962
Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
2 janv. 2019 à 11:25
2 janv. 2019 à 11:25
Au temps pour moi, je n'avais pas vu que tu l'avais mis...
Tu peux faire un "print nb" quelque part dans question() pour voir quelle valeur y est stockée ?
Tu peux faire un "print nb" quelque part dans question() pour voir quelle valeur y est stockée ?
Bonjour.
Les global à l'intérieur d'une fonction doivent se situer de préférences en début de fonctions.
Il vaut mieux éviter de déclarer des fonctions à l'intérieur d'autres fonctions, il y a rarement de cas où l'on a besoin de faire cela.
Voici un exemple de comment ton programme devrait être structuré, ce n'est sans doute pas ce que tu souhaites obtenir, mais ça peut te montrer un peu un exemple simple et fonctionnel.
On pourrait grandement améliorer et condenser ce simple programme, mais en l'état, cela te permettra de comprendre comment organiser ton script un peu plus correctement avec de simples fonctions.
Les global à l'intérieur d'une fonction doivent se situer de préférences en début de fonctions.
Il vaut mieux éviter de déclarer des fonctions à l'intérieur d'autres fonctions, il y a rarement de cas où l'on a besoin de faire cela.
Voici un exemple de comment ton programme devrait être structuré, ce n'est sans doute pas ce que tu souhaites obtenir, mais ça peut te montrer un peu un exemple simple et fonctionnel.
import random import tkinter as tk def additionner(nombre1, nombre2): return nombre1 + nombre2 def soustraire(nombre1, nombre2): return nombre1 - nombre2 def multiplier(nombre1, nombre2): return nombre1 * nombre2 # Dictionnaire reliant signes et fonctions operateurs = { '+':additionner, '-':soustraire, '×':multiplier, } # Fonction choisissant et retournant un tuple de deux nombres et un opérateur def choisir_operation(): nombres = (random.randint(0, 99), random.randint(0, 99)) signe = random.choice(list(operateurs)) return nombres, signe # Fonction calculant le résultat d'une opération def calculer_operation(nombres, signe): operateur = operateurs[signe] return operateur(nombres[0], nombres[1]) # Plus simplement # return operateurs[signe](*nombres) # Fonction formatant l'opération en chaîne de caractères def formater_operation(nombres, signe): return '{1} {0} {2}'.format(signe, *nombres) # Fonction affichant une opération à effectuer def questionner(): # Reset de la valeur de l'entrée à une chaîne vide entree.delete(0, 'end') # Récupération d'une nouvelle opération nombres, signe = choisir_operation() # Formatage en chaîne de l'opération operation = formater_operation(nombres, signe) # Calcul du résultat correct resultat_correct = calculer_operation(nombres, signe) # Enregistrement de l'opération, et du résultat correct resultats.append([operation, resultat_correct]) # Affichage de l'opération à résoudre label_operation['text'] = 'Combien font %s ?' % operation # Fonction enregistrant le résultat saisi par l'utilisateur def valider_resultat(event=None): # Ajout au dernier élément de résultats, la valeur saisie resultats[-1].append(entree.get()) # Si nombre de résultats pas encore atteint if len(resultats) < NOMBRE_QUESTIONS: # Rappel de la fonction questionner questionner() else: # Le nombre d'opération total a été atteint, affichage des résultats afficher_resultats() # Affiche les résultats des opérations enregistrées def afficher_resultats(): # Destruction du label et de l'entry label_operation.destroy() entree.destroy() frame_resultats = tk.Frame(fenetre) frame_resultats.grid() # Titre label_titre = tk.Label(frame_resultats, text='Résultats') label_titre.grid(columnspan=3) # Parcours et affichage de la liste des résultats for i, resultat in enumerate(resultats, 1): label_question = tk.Label(frame_resultats, text=resultat[0]) label_question.grid(row=i, column=0, padx=10) label_reponse = tk.Label(frame_resultats, text=resultat[2], fg='green') label_reponse.grid(row=i, column=1, padx=10) # Si résultat incorrect, affichage du bon résultat if str(resultat[1]) != resultat[2]: label_reponse['fg'] = 'red' label_reponse_correcte = tk.Label(frame_resultats, text=resultat[1], fg='yellow') label_reponse_correcte.grid(row=i, column=2, padx=10) # Constante déterminant combien d'opérations sont à résoudre NOMBRE_QUESTIONS = 10 # Liste qui contiendra des listes avec pour valeurs : # - opération à résoudre # - résultat correct # - valeur saisie par l'utilisateur resultats = [] fenetre = tk.Tk() fenetre.geometry("300x400") fenetre.title("OPÉRATIONS") label_operation = tk.Label(fenetre) label_operation.pack() entree = tk.Entry(fenetre) entree.pack() entree.focus() entree.bind("<Return>", valider_resultat) # Appel de la première question questionner() fenetre.mainloop()
On pourrait grandement améliorer et condenser ce simple programme, mais en l'état, cela te permettra de comprendre comment organiser ton script un peu plus correctement avec de simples fonctions.
Merci beaucoup pour votre réponse je vais essayer de modifier un peu ce programme afin qu'il réponde à mes critères.
Pouvez-vous m'expliquer à quoi sert le "event=None" et le "len" devanr résultat dans cette partie du programme svp ?
# Fonction enregistrant le résultat saisi par l'utilisateur
def valider_resultat(event=None):
# Ajout au dernier élément de résultats, la valeur saisie
resultats[-1].append(entree.get())
# Si nombre de résultats pas encore atteint
if len(resultats) < NOMBRE_QUESTIONS:
# Rappel de la fonction questionner
questionner()
else:
# Le nombre d'opération total a été atteint, affichage des résultats
afficher_resultats()
Pouvez-vous m'expliquer à quoi sert le "event=None" et le "len" devanr résultat dans cette partie du programme svp ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
2 janv. 2019 à 13:20
2 janv. 2019 à 13:20
Boujour,
voici mon nouveau code :
Cependant ma fonction ne s'arrête toujours pas alors que quand j'affiche nb cela marche bien j'ai 1,2,3...
voici mon nouveau code :
global nb
if nb<=10:
nb=nb+1
entree.bind("<Return>", reponse)
else :
entree.bind("<Return>", fin)
Cependant ma fonction ne s'arrête toujours pas alors que quand j'affiche nb cela marche bien j'ai 1,2,3...
31 déc. 2018 à 12:11
Car avec ma fonction les calculs s'enchaînent en disant si le résultat est correct ou non mais cela ne s'arrête jamais.