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

Résolu
NathanielM Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
NathanielM Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -
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...:/
A voir également:

2 réponses

Felice_ Messages postés 265 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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