Float(entry.get()) : coud not convert

Résolu/Fermé
NathanielM Messages postés 4 Date d'inscription dimanche 21 mai 2017 Statut Membre Dernière intervention 23 mai 2017 - Modifié le 21 mai 2017 à 17:03
NathanielM Messages postés 4 Date d'inscription dimanche 21 mai 2017 Statut Membre Dernière intervention 23 mai 2017 - 23 mai 2017 à 22:46
Bonjour,

je tiens d'abord à dire que j'utilise depuis très peu le forum et Python 3.4.5 ainsi que Tkinter.
Je dois faire un jeu avec des exercices. Le menu du jeu importe un exercice de calcul du coefficient de dilatation et fait appel à la fonction qui lance l'exercice ("ExTime"). L'exercice lancé, on peut appuyer sur le bouton "jouer" qui lance une suite de fonctions.
La 1ère ("ExTimeSpeed") génère une vitesse. L'utilisateur doit entrer le coefficient de dilatation que je veux convertir en float : il y a alors l'erreur "could not convert string to float". J'aimerais aussi utiliser les résultats de ExTimeSpeed dans d'autres fonctions comme ("ExTimeCalc").
Voici le script raccourci en laissant que les 3 fonctions citées:

from tkinter import*
import random

score=0
Q=10

def ExTime():
    '''exercice dilatation du temps'''
    
    def ExTimeCalc(a,b,c):
        '''calcul le coefficient'''
        lux=300000000
        #si la vitesse est en fraction de la celerite
        if a=="f":
            speed=lux*b
            RappSpeed=(speed**2)/(lux**2)
            coeff=1/((1-RappSpeed)**0.5)
            return coeff
        #sinon si la vitesse est en m/s
        elif a=='r':
            RappSpeed=(b**2)/(lux**2)
            coeff=1/((1-RappSpeed)**0.5)

            return coeff
        #lancement du comparateur coeff calcule/reponse
        ExTimeCheck(c,coeff)

    def ExTimeSpeed():
        '''genere la vitesse, coeff entre par l'utilisateur'''
        popup.destroy()
        ReturnMenu.destroy()
        play.destroy()

        speedraw=random.uniform(0.1,70000)
        speedraw=round(speedraw,2)

        if 0.10<=speedraw<=0.90:
            #vitesse sous forme de fraction de la célérité
            SpeedFormat="f"
            FrameSpeed=Label(canvas,text=(speedraw,"c"))
            FrameSpeed.place(x=600,y=300)

            #Entree de la reponse
            ImputLab=Label(canvas,text="quel est le coefficient de dilatation?")
            ImputLab.place(x=600,y=400)
            Imput=Entry(canvas)
            Imput.place(x=600,y=500)
            answer=Imput.get()
            answer=float(answer)
            #bouton valider, lancement du calcul
            submit=Button(canvas,text="valider",command=ExTimeCalc(SpeedFormat,speedraw,answer))
            submit.place(x=700,y=500)

            return SpeedFormat,speedraw,answer

        else:
            #vitesse en m/s
            SpeedFormat='r'
            FrameSpeed=Label(canvas,text=(speedraw,"m/s"))
            FrameSpeed.place(x=600,y=300)

            #entree de la reponse
            ImputLab=Label(canvas,text="quel est le coefficient de dilatation?")
            ImputLab.place(x=600,y=400)
            Imput=Entry(canvas)
            Imput.place(x=600,y=500)
            answer=Imput.get()
            answer=float(answer)

            #bouton valider, lancement du calcul
            submit=Button(canvas,text="valider",command=ExTimeCalc(SpeedFormat,speedraw,answer))
            submit.place(x=700,y=500)

            return SpeedFormat,speedraw,answer

    #fenetre et canvas 
    [...]
    #menu de l'exercice
    [...]
    play=Button(canvas, text="jouer",command=ExTimeSpeed)
    play.place(x=700,y=420)

    fenetre.mainloop()


En espérant avoir été clair...:/

2 réponses

Felice_ Messages postés 265 Date d'inscription mardi 25 avril 2017 Statut Membre Dernière intervention 20 juillet 2017 11
Modifié le 21 mai 2017 à 17:35
Bonjour NathanielM,

Ton « Imput.get() » il retourne quoi ? Car selon ce que ça retourne, ça ne peut être convertie en flottant…

Peut-être as-tu mal placé ton « Imput.get() »…
0
NathanielM Messages postés 4 Date d'inscription dimanche 21 mai 2017 Statut Membre Dernière intervention 23 mai 2017
Modifié le 21 mai 2017 à 17:38
L'utilisateur doit rentrer un nombre au centième près.
J'ai placé imput.get après avoir créé la barre d'entrée pour la réponse... :/
0
gudu > NathanielM Messages postés 4 Date d'inscription dimanche 21 mai 2017 Statut Membre Dernière intervention 23 mai 2017
21 mai 2017 à 20:20
command=ExTimeCalc(SpeedFormat,speedraw,answer)


Tu ne peux pas faire ça, car ta fonction est appelée dès le lancement de ton script.

Il y a plusieurs façon de parer ce problème, la plus courante est l'utilisation d'une fonction anonyme de façon à obtenir :

command=lambda sf=SpeedFormat, sd=speedraw, a=answer : ExTimeCalc(sf, sd, a)
0
NathanielM Messages postés 4 Date d'inscription dimanche 21 mai 2017 Statut Membre Dernière intervention 23 mai 2017
21 mai 2017 à 20:46
Merci pour le conseil. J'aimerais pouvoir te dire si ça a marché, mais comme il y a toujours l'erreur de conversion...
0
gudu > NathanielM Messages postés 4 Date d'inscription dimanche 21 mai 2017 Statut Membre Dernière intervention 23 mai 2017
21 mai 2017 à 21:38
Tu rentres bien tes décimaux avec comme séparateur décimal le point et non la virgule au moins.

Parce qu'il n'y aucun problème à récupérer une chaine venant d'un entry et la convertir en float si le format de la chaine est correcte.

Donc affiche ce que contient ton entry avant de le convertir en float.
0
NathanielM Messages postés 4 Date d'inscription dimanche 21 mai 2017 Statut Membre Dernière intervention 23 mai 2017
23 mai 2017 à 22:46
Problème résolu. Merci pour l'aide :)




def ExTime():
'''exercice dilatation du temps'''
def ExTimeSpeed():
#entree de la reponse
ImputLab=Label(canvas,text="quel est le temps mesure?")
ImputLab.place(x=600,y=400)

Imput=Entry(canvas, textvariable=answer)
Imput.place(x=600,y=500)

answer = DoubleVar()
play=Button(canvas, text="jouer",command=ExTimeSpeed)
play.place(x=700,y=420)

fenetre.mainloop()

0