¿Cómo puedo convertir una variable tipo float en string?

publicado por: Anonymous

Es una interfaz gráfica con la que se pretende pasar de la forma polar a la forma geométrica de los números imaginarios.

Obtengo el siguiente error:

Traceback (most recent call last):

  File "main.py", line 33, in <module>
    boton1=Button(ventana,text="Calcular",command=geo_polar()).grid(row=1,column=2)

  File "main.py", line 22, in geo_polar
    solucion=print("Radio= "+p1+" y angulo= "+p2)

TypeError: Can't convert 'float' object to str implicitly

Este es el código:

from tkinter import *
import math
import time

ventana=Tk()

dato1=IntVar()
dato2=IntVar()
dato3=StringVar()
dato4=IntVar()
dato5=IntVar()
dato6=StringVar()

def geo_polar():
    p1=math.sqrt(dato1.get()*dato1.get()+dato2.get()*dato2.get())
    try:
        p2=math.atan(dato2.get()/dato1.get())
        pass
        except Exception as e:
    print("ERROR")

    solucion=print("Radio= "+p1+" y angulo= "+p2)
    entrada.set(solucion)

etiqueta1=Label(ventana,text="Pasar de geometrica a 
polar").grid(row=0,column=0)
entrada1=Entry(ventana,textvariable=dato1).grid(row=1,column=0)
entrada2=Entry(ventana,textvariable=dato2).grid(row=1,column=1)
boton1=Button(ventana,text="Calcular",command=geo_polar()).grid(row=1,column=2)

entada3=Entry(ventana,textvariable=dato3).grid(row=1,column=3)

etiqueta2=Label(ventana,text="Pasar de polar a 
geometrica").grid(row=2,column=0)
entrada4=Entry(ventana,textvariable=dato4).grid(row=3,column=0)
entada5=Entry(ventana,textvariable=dato5).grid(row=3,column=1)
boton2=Button(ventana,text="Calcular").grid(row=3,column=2)
entada6=Entry(ventana,textvariable=dato6).grid(row=3,column=3)


ventana.mainloop()

solución

Primero, el error se debe a que Python jamás realiza conversiones implícitas de tipos. Está intentando concatenar objetos str con float directamente:

"Radio= "+p1+" y angulo= "+p2

Para hacer esto debes hacer un casting explícito de float a str:

"Radio= "+str(p1)" y angulo= "+str(p2)

ahora bien, la concatenación de cadenas es un proceso muy ineficiente dado que son inmutables, lo que implica que al concatenar hay que crear un nuevo objeto str. Es más simple si usas str.format:

"Radio= {} y angulo= {}".format(p1, p2)
"Radio= {} y angulo= {}".format(p1, p2)  # Solo 3 decimales

o también literales de cadena formateados en Python >= 3.6:

f"Radio= {p1} y angulo= {p2}"
f"Radio= {p1:.3f} y angulo= {p2:.3f}"   # solo 3 decimales

Por otro lado, tienes algunos errores más:

  • En la variable solucion de la función:

    solucion = print("Radio= "+p1+" y angulo= "+p2)
    entrada.set(solucion)
    

    Primero, entrada no existe en tu código, en todo caso debe ser dato3.

    Por otro lado, solucion almacena el retorno de print, que es None. Debe contener la cadena para asignarla a la StringVar, print en este caso no tiene sentido en la GUI:

    solucion = "Radio= {} y angulo= {}".format(p1, p2)
    dato3.set(solucion)
    
  • Otro error tiene lugar al pasar la función a ser llamada cuando se hace click en el botón:

    command=geo_polar()
    

    esto hace que a command se le pase el retorno de geo_polar (None en este caso) ya que al usar () la estás llamando. Le debes pasar la referencia a la función, no su retorno:

    command=geo_polar
    
  • También tienes algunos errores tipográficos en el nombre de las variables entada5 por entrada5 y entada6 por entrada6.

Además de lo anterior, algunas cosas que aunque no son errores debes considerar:

  • Importar mediante widcard (*) es por lo general una mala práctica en Python y solo se debe usar en aquellos casos en los que esté justificado (y acortar el código a escribir no es una de ellas). A grandes rasgos no se debe usar porque se pierde legibilidad en el código al no especificar de forma explícita el espacio de nombres al que pertenece el identificador, puebla el espacio de nombres actual sin necesidad y, derivado de lo anterior, puede causar enmascaramiento de identificadores entre diferentes espacios de nombres, con los consiguientes errores como consecuencia de ello.

  • No tiene sentido que hagas lo siguiente:

    entry = tk.entry(...).grid(row=0, column=0)
    

    con ello entry no hace referencia a la instancia de tkinter.Entry creada (o cualquier otro widget), sino al retorno de su método grid, que de nuevo es None. Esto hace que entry no sirva para nada. O haces directamente:

    tk.entry(...).grid(row=0, column=0)
    

    o si luego vas a necesitar hacer referencia al widget, aplica grid en una línea distinta:

    entry = tk.entry(...)
    entry.grid(row=0, column=0)
    

    Lo mismo se aplica a pack y place.

Teniendo en cuenta todo lo anterior el código puede quedar:

import math
import tkinter as tk


ventana = tk.Tk()

dato1 = tk.IntVar()
dato2 = tk.IntVar()
dato3 = tk.StringVar()
dato4 = tk.IntVar()
dato5 = tk.IntVar()
dato6 = tk.StringVar()

def geo_polar():
    p1 = math.sqrt(dato1.get() * dato1.get() + dato2.get() * dato2.get())
    try:
        p2 = math.atan(dato2.get() / dato1.get())
        solucion = "Radio= {:.3f} y ángulo= {:.3f}".format(p1, p2)
    except Exception as e:
        solucion = "ERROR"

    dato3.set(solucion)

etiqueta1 = tk.Label(ventana, text="Pasar de geometrica a polar")
entrada1 = tk.Entry(ventana, textvariable=dato1)
entrada2 = tk.Entry(ventana, textvariable=dato2)
entrada3 = tk.Entry(ventana,textvariable=dato3, width=40)
boton1 = tk.Button(ventana, text="Calcular", command=geo_polar)

etiqueta1.grid(row=0, column=0)
entrada1.grid(row=1, column=0)
entrada2.grid(row=1, column=1)
entrada3.grid(row=1, column=3)
boton1.grid(row=1, column=2)

etiqueta2 = tk.Label(ventana, text="Pasar de polar a geometrica")
entrada4 = tk.Entry(ventana, textvariable=dato4)
entrada5 = tk.Entry(ventana, textvariable=dato5)
boton2 = tk.Button(ventana, text="Calcular")
entrada6 = tk.Entry(ventana, textvariable=dato6,  width=40)

etiqueta2.grid(row=2, column=0)
entrada4.grid(row=3, column=0)
entrada5.grid(row=3, column=1)
boton2.grid(row=3, column=2)
entrada6.grid(row=3, column=3)


ventana.mainloop()

Sería bueno para la legibilidad del código que les dieras nombres más descriptivos a las variables, para que a quién lea el código le resulte más comprensible de primeras. Con esto ya puedes continuar para completar la app.

introducir la descripción de la imagen aquí

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *