Python - ¿Por qué falla mi código?

   
Vista:
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon ichiparanoid@gmail.com (17 intervenciones) el 11/10/2014 19:16:55
Cordial saludo:

Mi nombre es Jhon, soy técnico electrónico y no tengo ni idea de programación. Este es mi primer lenguaje y mi experiencia no pasa de unas... 3 semanas
Estoy haciendo una pequeña aplicación para calcular todo lo necesario para construir un transformador (Número de vueltas en las bobinas, calibre de los alambres, amperajes, tamaño del núcleo, etc).
La primer versión es funcional, en modo consola, pero funcional. Ahora, para aprender cosas nuevas, estoy trabajando con Tkinter en una GUI.
El caso es que para los cálculos necesito unos datos que debe introducir el usuario. Uno de ellos es el Voltaje AC. Pero el usuario no siempre sabe el voltaje AC (Tampoco es difícil saberlo, pero para que el programa sea a prueba de dummies) sino que conoce el voltaje DC que necesita la carga a la que irá conectada el transformador.
En modo consola lo resolví pidiendo al usuario los dos datos AC y DC, pero pidiendo que escoja uno u otro y deje el otro en blanco:

1
2
3
4
5
6
7
8
9
10
11
12
print("""Introduzca el voltaje AC a la salida o el DC si es el que conoce.
No introduzca ambos datos.""" )
ac = input("Voltaje AC: " )
dc = input("Voltaje DC: " )
ac1 = bool(ac)
dc1 = bool(dc)
if ac1 == True and dc1 == False:
    ac2 = float(ac)
    dc2 = ac2 * 1.4142
if ac1 == False and dc1 == True:
    dc2 = float(dc)
    ac2 = dc2 / 1.44142

Con eso es suficiente. En la versión con GUI, quise que el usuario ingresara el voltaje (entry_3) y luego escogiera en un checkbutton si se refería a voltaje AC o DC (eligeAC o eligeDC). Los dos checkbutton tienen onvalue=1 y offvalue=0.
Mi planteamiento era:

1
2
3
4
5
6
7
8
9
#Calcular el voltaje de salida sea AC o DC 
vout = entry_3.get()
def escoge():
    if  eligeAC==1 and eligeDC==0:
        AC=vout
        DC=vout*1.4142
    if  eligeDC==1 and eligeAC==0:
        DC=vout
        AC=vout/1.4142
El caso es que cuando oprimo el botón para que una Label me muestre los resultados, me avisa que las variables no están definidas. Si escojo AC me dice "AC no defined" y si calculo con DC me dice "DC no defined":

NameError: name 'AC' is not defined

Otra cosa que me he dado cuenta ahora es que la variable vout es un string, por lo que una vez resuelva lo de AC y DC me va a dar un error.
En modo consola convierto el string AC en float:

AC=float(AC)

y funciona. Pero intento vout=float(vout) y me dice que no puedo convertir strings a float.

¿Podría alguien ayudarme con esto por favor?

Muchas gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

¿Por qué falla mi código?

Publicado por Agustin (21 intervenciones) el 12/10/2014 00:57:00
La verdad, es que como yo soy un novato, y de voltajes y esas cosas no entiendo, de mucho no te puedo ayudar, pero puedo intentarlo.
Podrías postear el código entero?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 12/10/2014 03:17:17
Puse los nombres de las variables AC y DC con mayúsculas. Corregido.
El fallo está en las label con el resultado:

1
2
3
4
5
6
7
8
9
10
11
12
labelvac = Label (gui, text= "Vout AC: "+ac+" VAC")
    labelvac.grid(row=6, column=0)
    labelvdc = Label (gui, text= "Vout DC: "+dc+" VDC")
    labelvdc.grid(row=7, column=0)
 
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
  File "C:/Users/Jhon/Documents/Python/proyectos/pytraf gui/Pytraf gui.py", line 47, in resw
    labelvac = Label (gui, text= "Vout AC: "+ac+" VAC")
NameError: name 'ac' is not defined

El otro problema que veo es que no puedo convertir la variable vout (Que es una string, pero son números) en float(vout)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alejandro

¿Por qué falla mi código?

Publicado por Alejandro (84 intervenciones) el 12/10/2014 03:50:00
No se si hayas posteado todo el código completo, pero yo no veo ninguna variable "ac" definida. La variable que veo es "AC" (en mayúsculas), y eso es diferente, ya que una esta en minúsculas y otra en mayúsculas.
Sobre el float prueba con esto.

1
variablename = float(variableentry.get())
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 12/10/2014 04:09:13
Sí, me di cuenta de las mayúsculas y las corregí en pycharm. Pero me sigue dando el mismo fallo.
Gracias por contestar.

Mira:
1
2
vout = float(entry_3.get())
ValueError: could not convert string to float:
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alejandro

¿Por qué falla mi código?

Publicado por Alejandro (84 intervenciones) el 12/10/2014 04:59:11
Yo no use mucho tkinter, pero investigue un poco. Guiate de lo siguiente.

1
2
3
4
variable = DoubleVar()  #Float
Entry(textvariable=variable)
 
vout = variable.get()

Espero y funcione. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 12/10/2014 05:18:54
Creo haber solucionado lo del float (AL menos no me ha dado el error). Muchas gracias.
EL problema sigue siendo las funciones ac y dc que la label me salen como definidas. Investigando creo que tengo la pista: Son variables locales de la función esocoge() y estoy intentando usarlas en la función rsw().
¿Puede ser eso?
Intenté añadiendo global ac y global dc pero no funcionó. Tal vez lo hago mal.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alejandro

¿Por qué falla mi código?

Publicado por Alejandro (84 intervenciones) el 12/10/2014 05:32:34
El label no esta dentro de la funcion escoge? Intenta con lo siguiente.

1
2
3
4
5
6
7
8
9
10
vout = variable.get()
global AC = 0    #De esta manera se definen con un valor por defecto y se podran acceder desde cualquier parte del programa
global DC = 0
def escoge():
    if eligeAC==1 and eligeDC==0:
        AC=vout
        DC=vout*1.4142
    if eligeDC==1 and eligeAC==0:
        DC=vout
        AC=vout/1.4142
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 12/10/2014 18:18:23
Gracias por responder Alejandro. La verdad con ese cambio la diferencia es que ya no me dice name "ac" no defined, sino global name "ac" no defined.
Pero funcionar, sigue sin funcionar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alejandro

¿Por qué falla mi código?

Publicado por Alejandro (84 intervenciones) el 12/10/2014 19:26:15
No te puedo ayudar mucho, porque desconozco como tengas ordenado el código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 12/10/2014 19:34:51
Ahora mismo no tengo mi laptop a mano. Estoy en otra compu donde no tengo mi código. Pero más tarde lo publico a ver si puedes echarme una mano.
Muchas gracias de todo modos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

¿Por qué falla mi código?

Publicado por xve (1229 intervenciones) el 13/10/2014 07:44:04
Hola Jhon, nos puedes adjuntar el código entero para poder visualizarlo completamente y probarlo?

Me da la sensación que tiene que ser un error muy tonto, pero sin verlo entero...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 13/10/2014 18:23:29
Hola, gracias por la ayuda.

Ahora estoy en el trabajo y no tengo el código original. Tengo uno con el que había estado trasteando hoy en un python portable.
Pero el fallo es el mismo.
Faltan muchos cálculos en este código. Pero el problema está aquí en alguna de estas líneas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
__author__ = 'Jhon Barcasnegras'
# -*- coding: utf-8 -*-
from tkinter import *
import math
gui= Tk()
#Los textos de la GUI. 
label_1 = Label(gui, text='POTENCIA:')
label_1.grid(row=0, column=0)
label_2 = Label(gui, text='VOLTAJE IN:')
label_2.grid(row=1, column=0)
label_3 = Label(gui, text='VOLTAJE OUT: ')
label_3.grid(row=2, column=0)
label_4 = Label(gui, text= 'WATTS')
label_4.grid(row=0, column=2)
label_5 = Label(gui, text= 'VOLTIOS AC')
label_5.grid(row=1, column=2)
#El usuario ingresa la potencia en watios
entry_1 = Entry(gui)
#El usuario ingresa el voltaje ac en la entrada del trafo
entry_2 = Entry(gui)
#El usuario ingrea el voltaje de salida del trafo
entry_3 = Entry(gui)
entry_1.grid(row=0, column=1)
entry_2.grid(row=1, column=1)
entry_3.grid(row=2, column=1)
checkac = Checkbutton(gui, text='AC', onvalue=1, offvalue=0)
checkdc = Checkbutton(gui, text='DC', onvalue=1, offvalue=0)
checkac.grid(row=2, column=2)
checkdc.grid(row=2, column=3)
if checkac==1 and checkdc==0:
        ac=float(entry_3.get())
        dc=ac*1.4142
if checkdc==1 and checkac==0:
        dc=float(entry_3.get())
        ac=dc/1.4142
def resw():
    labelw = Label (gui,text= "Potencia= "+entry_1.get()+" WATTS")
    labelw.grid(row=4, column=0)
    labelvin = Label (gui, text= "Voltaje entrada= "+entry_2.get()+" VAC")
    labelvin.grid(row=5, column=0)
    labelvac = Label (gui, text= "Voltaje AC= "+ac+"VAC")
    labelvac.grid(row=6, column=0)
    labelvdc.grid(row=7, column=0)
    labelvdc = Label (gui, text= "Voltaje DC="+dc+"VDC")
 
 
#Ese evento command es sólo para probar
boton1=Button(gui, text='CALCULAR', command=resw)
boton1.grid(row=3, column=1)
mainloop()

El error así como está:
1
2
3
4
5
File "F:\Portable Python 3.2.5.1\App\lib\tkinter\__init__.py", line 1456, in __call__
    return self.func(*args)
  File "F:\__init__.py", line 41, in resw
    labelvac = Label (gui, text= "Voltaje AC= "+ac+"VAC")
NameError: global name 'ac' is not defined
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

¿Por qué falla mi código?

Publicado por xve (1229 intervenciones) el 14/10/2014 08:34:47
Hola Jhon, no se en que sistema operativo lo ejecutas, ni que versiones de python o Tk estas utilizando, pero en linux me ha funcionado perfectamente!!!

python-gtk

Si nos puedes comentar...

Estaria muy bien que publicaras tu código una vez finalizado!! tiene muy buena pinta!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 14/10/2014 12:06:29
¿Pero te ha permitido hacer el cálculo? Es decir, si le das un voltaje y le dices que es ac, te debe devolver ese voltaje como ac y como dc te devolverá ac multiplicado por raiz de 2 (Ahí lo reduje a 1.4142 pero pensaba importar el módulo math). Y si le dices que el voltaje es dc entonces lo que ingresaste será dc y ac será dc entre 1.4142.
A mí me abren las ventanitas pero falla al intentar usarlo.
Lo olvidaba: Estoy en windows 8.1. AHora mismo no tengo linux aunque solía usar mint.
No hay más código porque si no me funciona ese dato no puedo calcular los amperajes para continuar con el resto (En realidad son matemáticas sencillas)
En la otra versión sin interfaz que ya funciona (Aunque falta pulirla), si tengo el código completo. Te lo adjunto para que veas la idea.
EL resultado final debe ser algo así como la imagen.
Sin_titulo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 15/10/2014 05:50:49
La ignorancia es la madre del ingenio.
Bueno, no es así el refrán. Pero como no he podido desentrañar el misterio de mi código, de momento me he inventado otra solución al problema.
¿Ventaja? Me puede mostrar los cálculos tanto con la salida en AC como en DC...¡A la vez, si se lo pido!
¿Desventaja? Me parece una solución menos elegante y el código sea vuelto más largo y repetitivo.
Lo que hice fue poner dos botones, si oprimo AC me da unos resultados, si le doy a DC me da otros. Y si le doy a ambos,,, pues eso.
De todas maneras me gustaría seguir puliendo el programa así que seguiré investigando. Por lo pronto ya me muestra el voltaje AC y DC de salida así como los amperajes primarios y secundarios.
Aún faltan cosas, pero ya va cogiendo forma.
Si les da curiosidad ver en que acaba esto, cuando tenga el programa completo subo el código fuente en algún lado. A lo mejor algún electrónico lo mejora.

Gracias por la ayuda a todos. Seguiré pensando en la solución al problema con mi gui anterior porque me parecía más elegante. Pero mientras sigo trabajando en tener un software funcional aunque sea menos prolijo.

shot

He tenido problemas para convertir string a float y viceversa, pero esa práctica me está enseñando mucho (Nunca había programado, python es mi primer lenguaje). También he aprendido sobre redondeos, interfaces... Nada mal.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 15/10/2014 06:30:22
2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

¿Por qué falla mi código?

Publicado por xve (1229 intervenciones) el 15/10/2014 08:35:02
Hola Jhon, tengo ganas de ver el código final... haber que tal queda...

En esta misma web, puedes subir tu código en la sección de Código Fuente:
http://www.lawebdelprogramador.com/codigo/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 15/10/2014 14:33:59
Gracias por toda la ayuda. Cuando lo acabe lo comparto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

¿Por qué falla mi código?

Publicado por Jhon (17 intervenciones) el 16/10/2014 06:56:46
Ya subí la primera versión funcional con gui. He estado probando otro software que es el que usan mis compañeros de electrónica para construir transformadores y los resultados son similares, pero creo que el mío está enfocado de un modo más práctico.
http://www.lawebdelprogramador.com/codigo/Python/2798-Calculador_para_construir_transformadores.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

¿Por qué falla mi código?

Publicado por xve (1229 intervenciones) el 16/10/2014 11:08:21
Gracias por compartirlo Jhon... voy a ver que tal funciona!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar