TransWikia.com

por que en este código TKinter no puede volver una variable de sting a float para usarlo con math

Stack Overflow en español Asked by Juan Gonzalez on December 5, 2021

Estoy intentando hacer una calculadora de ley de coseno, pero no logro pasar la entrada de str a float.

import tkinter as tk
import math

ventana = tk.Tk()
ventana.title("ley de seno")
ventana.geometry('720x480')
ventana.configure(background='dark turquoise')
var = tk.StringVar()

def lados():
    lados = math.sqrt((math.pow(float(entrada1.get()), 2) + math.pow(float(entrada2.get()), 2)) - (
            2 * (float(entrada1.get())) * (float(entrada2.get())) * (math.cos(float(entrada3.get())))))

    return var.set(lados)

e1 = tk.Label(ventana, text='Numero 1:', bg='pink', fg='white')
e1.pack(padx=5, pady=4, ipadx=5, ipady=4, fill=tk.X)
entrada1 = tk.Entry(ventana)
entrada1.pack(fill=tk.X, padx=5, pady=5, ipadx=5, ipady=5, )

e2 = tk.Label(ventana, text='Numero 2:', bg='pink', fg='white')
e2.pack(padx=5, pady=4, ipadx=5, ipady=4, fill=tk.X)
entrada2 = tk.Entry(ventana)
entrada2.pack(fill=tk.X, padx=5, pady=5, ipadx=5, ipady=5, )

e3 = tk.Label(ventana, text='Numero 3:', bg='pink', fg='white')
e3.pack(padx=5, pady=4, ipadx=5, ipady=4, fill=tk.X)
entrada3 = tk.Entry(ventana)
entrada3.pack(fill=tk.X, padx=5, pady=5, ipadx=5, ipady=5, )

lado = tk.Button(ventana, text='lado',comand=lados())
lado.pack()
angulo = tk.Button(ventana, text='angulo')
angulo.pack()

eresul1 = tk.Label(ventana, textvariable=var, bg='pink', fg='white')
eresul1.pack(fill=tk.X, padx=5, pady=5, ipadx=5, ipady=5)

ventana.mainloop()

Cuando corro el programa me da este error y no entiendo que estoy haciendo mal

ValueError: could not convert string to float: ''

Si alguien sabe que está ocurriendo agradecería que me lo dijera, por que apenas estoy empezando y este es mi primer gran proyecto, y estoy muy frustrado.

2 Answers

Aquí hay varios errores:

La propiedad command debe contener el nombre de la función y no la ejecución de esta. Es decir: command=lado en lugar de command=lado().

Lo recomendable es que todos los Entrytengan asociado un textvariable para poder tener control de los datos de forma organizada. Así tendrías

v_num1 = StringVar()
v_num2 = StringVar()
v_num3 = StringVar()

Entonces los asignas a cada uno de los Entry.

Ahora la razón de tu error: buscando la ayuda de un Entry no veo que tenga el método get de la forma widget.get(), que es como lo estas llamando en la función. La forma de obtener el contenido de un Entry es utilizando el textvariable asociado, es decir, v_num.get()

Realiza esos cambios y el programa funcionará.

Answered by Luis Munoz on December 5, 2021

El problema es que la función lados() se está ejecutando justo al iniciar el script. Esto ya que al argumento command del Button llamado lado se le asigna la función directamente. La función no se ejecuta cuando se presiona el botón, si no al iniciar el script.

Cuando corro el programa me da este error y no entiendo que estoy haciendo mal

ValueError: could not convert string to float: ''

Dicho lo anterior, el valor que retorna el método get() de cualquier entrada va a ser un string vació o ''. La función al ejecutarse al iniciar el programa, no hay manera de ingrear un valor al Entry, por esto mismo se obtiene una cadena vacía.

¿Cómo solucionarlo?

Si alguien sabe que está ocurriendo agradecería que me lo dijera

Hay otras manera, pero la más fácil es ejecutando la función dentro de una función lambda (una función anónima).

boton = tk.Button(ventana,text="Ejecutar función",command = lambda: lados())

Por cierto, te recomiendo guardar este valor en una DoubleVar, luego es más fácil usar el valor para hacer operaciones matemáticas.

Espero te haya servido de algo.

Answered by user166844 on December 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP