Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Pasar datos de un Entry como atributos.
#1
Tengo un inconveniente que no entiendo por qué me sucede.

Hay dos códigos:
(Vista)
Código:
root = tkinter.Tk()
id = StringVar()
legajo = StringVar()
id_label = Label(root, text="ID Alumno:").place(x=20, y=20)
id_e = Entry(root, textvariable=id).place(x=140, y=20)
legajo_label = Label(root, text="Legajo ITF:").place(x=20, y=40)
legajo_e = Entry(root, textvariable=legajo).place(x=140, y=40)
guardar_datos = ttk.Button(root, text="Guardar", command= lambda: prueba5_modelo.imprimir(id.get(), legajo.get()))
guardar_datos.place(x=40, y=80)
root.mainloop()

(Modelo)
Código:
def crear_base():
    base = sqlite3.connect("prueba5.db")
    return base
def crear_tabla(base):
    cursor = base.cursor()
    sql = "CREATE TABLE IF NOT EXISTS tabla (id, legajo)"
    cursor.execute(sql)
    base.commit()
base = crear_base()
crear_tabla(base)
def imprimir(id, legajo):
    print("1", id, legajo)
    cursor = base.cursor()
    data = (id, legajo)
    sql = "INSERT INTO tabla(id, legajo) VALUES(?, ?)"
    cursor.execute(sql, data)
    base.commit()
    print("2", id, legajo)

Ambos funcionan a la perfección.
Pero cuando los copio y los pego en otro .py, al ejecutarlo me arroja el siguiente error:
AttributeError: 'NoneType' object has no attribute 'get'
Y no entiendo cómo puede estar surgiendo este error si al ejecutar esto por separado funciona bien.
¿Alguna idea?
Responder
#2
Hola, Diego.

¿En qué línea te arroja el error? De todos modos te adelanto que esto es incorrecto:

Código:
id_label = Label(root, text="ID Alumno:").place(x=20, y=20)

La forma correcta es:

Código:
id_label = Label(root, text="ID Alumno:")
id_label.place(x=20, y=20)

No es lo mismo, ya que en el primer caso estás asignando el valor de retorno de place() a id_label. Ese método retorna None, de ahí probablemente el error. Te sugiero que lo corrijas en todos los casos.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
Hola Francisco. La línea en la que me arroja error es en la del botón (guardar_datos = ttk.Button(root, text="Guardar", command= lambda: prueba5_modelo.imprimir(id.get(), legajo.get()))).

Entiendo lo que decís, debo separar el place y mandarlo debajo "id_label.place(x=20, y=20)". Lo he hecho, es una de las alternativas que probé, pero incluso así tal y como está, el código funciona perfecto. Eso es lo que me desconcierta. Funciona bien hasta que lo agrego al código general (que tiene muchas más líneas y por eso no lo puse aquí). Y el error que arroja es el del método get(). Si fuese así, debería arrojar error siempre, no dependiendo de dónde (en qué .py) esté escrito. ¿No?

Te agrego más, si al botón, le quito el "legajo.get()" y sólo lo dejo con el "id.get()", funciona. Me guarda el id que tipeo en el entry correspondiente. Cuando le agrego el legajo es que no funciona.
¿?
Responder
#4
Ya está. Les cuento por si a alguno le pasa.
Resulta que estaba trabajando con pestañas. Y ese bendito entry estaba presente en todas las pestañas (porque era el legajo). La función guardar necesitaba guardar los datos de una sola de las pestañas (la inicial, en la carga de datos) pero se ve que como el entry se llamaba igual en todas las pestañas, iba a buscar la info de ese entry en TODAS.
Renombré los otros entrys presentes en las demás pestañas y anduvo como coche nuevo.
Espero haberme explicado.
Gracias Francisco.
Responder
#5
Excelente, Diego. Me alegra que lo hayas solucionado.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 2 invitado(s)