Mensajes: 76
Temas: 22
Registro en: Jun 2022
Reputación:
2
20-04-2023, 06:00 PM
(Última modificación: 09-07-2023, 01:18 PM por Francisco.)
Buenasss, yo de nuevo.
Tengo esta función que calcula años a partir de fecha de nacimiento y mete el dato en un entry:
def etario(nacimiento):
ahora =datetime.now()
#fecha_str = input('Ingrese fecha "aaaa/mm/dd"...: ')
fecha = datetime.strptime(nacimiento, '%Y/%m/%d')
years =((ahora-fecha).days)//365
edad = StringVar()
edad.set(years)
edad_label2 = Entry(pesta0, background="#023d75", textvariable=edad, foreground="white")
edad_label2.place(x=140, y=140)
Pero cuando quiero llevarme el dato a una bd (guardar_datos = ttk.Button(pesta0, text="Guardar", command= lambda: guardar(id.get(), legajo.get(), nombre.get(), apellido.get(), dni.get(), nacimiento.get(), edad.get()))) no lo guarda. Guarda todos los demás datos, pero la edad no.
No tira error ni nada. Sólo no lo lleva.
Pregunta 1) ¿Por qué puede ser?
Pregunta 2) ¿Es correcto mostrar el dato en un entry? Había pensado en hacerlo en un label, pero como siempre usé entrys para capturar datos, opté por esa opción.
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Hola, Diego.
¿Cuál es el código que estás usando para insertar la edad en la base de datos?
Saludos
Mensajes: 76
Temas: 22
Registro en: Jun 2022
Reputación:
2
21-04-2023, 06:09 PM
(Última modificación: 21-04-2023, 06:41 PM por Diego.)
¡¡Lo resolví!!
Cuento cómo. En la función que estaba usando:
def etario(nacimiento):
ahora =datetime.now()
#fecha_str = input('Ingrese fecha "aaaa/mm/dd"...: ')
fecha = datetime.strptime(nacimiento, '%Y/%m/%d')
years =((ahora-fecha).days)//365
edad = StringVar() ----------> línea mala
edad.set(years)
edad_label2 = Entry(pesta0, background="#023d75", textvariable=edad, foreground="white")
edad_label2.place(x=140, y=140)
comenté la línea edad = StringVar() y funcionó. La verdad es que con tantos intentos para que funcione ya no recuerdo por qué estaba presente esa línea, pero se ve que de alguna manera impedía que la función de guardado tomara el dato.
Hay muchas cosas que no domino, y no sé a ciencia cierta por qué ocurren. Así que... si alguien puede explicarme por qué esa línea hacía que la edad no se transfiera a la bbdd, mejor.
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Hola, Diego.
Si al comentar esa línea el código funciona, entonces tenés otra variable (global) llamada edad definida en algún otro lugar del código. Como sea, en la mayoría de los casos es innecesario usar StringVar(), IntVar(), etc. Simplemente usá los métodos .get() e .insert() de la caja de texto para leer y escribir el contenido: https://recursospython.com/guias-y-manua...y-tkinter/. Así tu código va a quedar mucho más simple.
Saludos
Mensajes: 76
Temas: 22
Registro en: Jun 2022
Reputación:
2
Es verdad Francisco. Tenía una variable por fuera de la función y esa era la que se transmitía a la base, con la particularidad de que estaba vacía porque la función no le asignaba el valor. Gracias.
Consulta asociada: Ahora que logré que la bd guarde ese valor (edad) ¿de qué manera puedo hacer que se actualice automáticamente?
Hoy, tal y como está el código, la edad es la resultante de la fecha de nacimiento contra la fecha actual (del sistema, más específicamente). Y esto no está mal, porque calcula la edad al momento de la carga. Pero dentro de un año, esa edad cambió (por esa maldita costumbre que tiene el tiempo de envejecernos) sin embargo el valor seguirá siendo el mismo. ¿Hay manera de que ese dato se actualice?
Se me ocurre, por ejemplo, incluír la función dentro del botón de consultas, para que, previo a la muestra de la consulta, actualice la edad. Pero debería incluír también una función de modificación de ese dato, para que quede asentado en la base, con lo cual, al momento de apretar el botón de consulta, la secuencia de comandos sería: la función que calcula la edad, la función que actualiza la edad en la base y finalmente la función que genera la consulta en la base.
¿Esto estaría bien?
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Hola, Diego.
Mi sugerencia es no guardar la edad en la base de datos. Si ya tenés la fecha de nacimiento, cada vez que necesites la edad podés calcularla rápidamente con una simple resta, ya sea para hacer consultas como para mostrarla en algún lugar de la ventana.
Saludos
Mensajes: 76
Temas: 22
Registro en: Jun 2022
Reputación:
2
Tenés toda la razón. Ese dato (edad) no necesita ser persistido. Lo que no sé es cómo recuperar la fecha de nacimiento almacenada en la bd (para llevarla a python y allí realizar el cálculo que determine la edad). Pero eso es tema primero de investigación y luego de una eventual nueva consulta. Así que llegado el momento, me vuelvo a dar una vuelta por aquí (sino esto será eterno).
Muchas gracias Francisco.
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Excelente. Saludos!
|