Signaler

Float(entry.get()) : coud not convert [Résolu]

Posez votre question NathanielM 4Messages postés dimanche 21 mai 2017Date d'inscription 23 mai 2017 Dernière intervention - Dernière réponse le 23 mai 2017 à 22:46 par NathanielM
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...:/
Utile
+0
plus moins
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() »…
NathanielM 4Messages postés dimanche 21 mai 2017Date d'inscription 23 mai 2017 Dernière intervention - 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... :/
Répondre
gudu- 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)
Répondre
NathanielM 4Messages postés dimanche 21 mai 2017Date d'inscription 23 mai 2017 Dernière intervention - 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...
Répondre
gudu- 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.
Répondre
Donnez votre avis
Utile
+0
plus moins
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()

Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !