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.
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 Entry
tengan 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.
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP