elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Python (Moderador: Danielㅤ)
| | |-+  Función en Python
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Función en Python  (Leído 11,407 veces)
Sk9ITk5Z


Desconectado Desconectado

Mensajes: 2.306



Ver Perfil WWW
Función en Python
« en: 23 Marzo 2023, 18:50 pm »

Buenos días como están? espero me puedan ayudar con una duda que tengo.
Estoy haciendo un sistema de recepción de equipos en python, lo voy a crear por partes, soy principiante apenas estoy aprendiendo el lenguaje. Tengo una función donde creo cuadros de texto para meter datos(de clientes), y otra función donde debo tomar el dato que metí en el cuadro de texto para poder guardar esa información en una tabla(clientes) de una base de datos pero me da error en la función del botón de alta ya que dice que no esta definida una variable en este caso son las variables de ID, Nombre, etc.... les pego el código a ver si me pueden ayudar...



Código
  1. # Crear la función para el boton Cliente
  2. def clientes():
  3.    ventana2 = tkinter.Toplevel(ventana)
  4.    ventana2.title("Alta de Clientes")
  5.    ventana2.geometry("500x250")
  6.  
  7.    # Crear etiquetas
  8.    etiquetaID = Label(ventana2, text="ID:")
  9.    etiquetaID.grid(row=0, column=0)
  10.  
  11.    etiquetaNombre = Label(ventana2, text="Nombre:")
  12.    etiquetaNombre.grid(row=1, column=0)
  13.  
  14.    etiquetaDireccion = Label(ventana2, text="Dirección:")
  15.    etiquetaDireccion.grid(row=2, column=0)
  16.  
  17.    etiquetaTelefono = Label(ventana2, text="Teléfono:")
  18.    etiquetaTelefono.grid(row=3, column=0)
  19.  
  20.    # Crear cuadros de texto
  21.    cuadroID = Entry(ventana2)
  22.    cuadroID.grid(row=0, column=1)
  23.  
  24.    cuadroNombre = Entry(ventana2)
  25.    cuadroNombre.grid(row=1, column=1)
  26.  
  27.    cuadroDireccion = Entry(ventana2)
  28.    cuadroDireccion.grid(row=2, column=1)
  29.  
  30.    cuadroTelefono = Entry(ventana2)
  31.    cuadroTelefono.grid(row=3, column=1)
  32.  
  33.    # Crear botones
  34.    botonAlta = Button(ventana2, text="Dar de Alta", command=alta)
  35.    botonAlta.grid(row=4, column=0)
  36.  
  37.    botonBorrar = Button(ventana2, text="Dar de Baja", command=baja)
  38.    botonBorrar.grid(row=4, column=1)
  39.  

aca   debo tomar esos datos:

Código
  1. # Crear la función para el boton Alta
  2. def alta():
  3.    id_cliente = cuadroID.get() #-------------------aqui me da el error, en obtener esa informacion
  4.    nombre_cliente = cuadroNombre.get()
  5.    direccion_cliente = cuadroDireccion.get()
  6.    telefono_cliente = cuadroTelefono.get()
  7.  
  8.    # Agregar los datos a la tabla de la base de datos
  9.    datos = [id_cliente, nombre_cliente, direccion_cliente, telefono_cliente]
  10.    cursor.execute("INSERT INTO tabla_clientes VALUES (?, ?, ?, ?)", datos)
  11.    conexion.commit()
  12.  
  13.  


« Última modificación: 23 Marzo 2023, 18:54 pm por Sk9ITk5Z » En línea

Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.
Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: Función en Python
« Respuesta #1 en: 24 Marzo 2023, 21:55 pm »

Hola, tu problema es que las variables no son accesibles desde el metodo alta(), además no veo que utilices StringVar(), por lo que sé, el componente Entry tiene que asociarse a una variable tipo StringVar() para que puedas guardar el contenido del entry.
Entonces lo que tenes que hacer es guardar el contenido que el usuario introduce en el componente Entry con una variable StringVar() y luego en el evento del botón de 'dar alta' le tienes que pasar la referencia a la función que procesa el evento y además el CONTENIDO de Entry.
Fijate este ejemplo muy simple:

Código
  1. import tkinter
  2.  
  3. def evento_enviar(entradaNombre):
  4.    print(f'Usuario ingresó: {entradaNombre.get()}')
  5.  
  6. def main():
  7.    ventana = tkinter.Tk()
  8.    ventana.geometry('600x400')
  9.  
  10.    tkinter.Label(ventana, text='Ingrese su nombre --> ').grid(row=0, column=0)
  11.  
  12.    entradaNombre = tkinter.StringVar()
  13.  
  14.    tkinter.Entry(ventana, width=30, textvariable=entradaNombre).grid(row=0, column=1)
  15.  
  16.    tkinter.Button(ventana, text='Enviar',
  17.        command=lambda: evento_enviar(entradaNombre)).grid(row=0, column=2)
  18.  
  19.    ventana.mainloop()
  20.  
  21. if __name__ == '__main__':
  22.    main()
  23.  

Por ultimo nota que esto tambien se podria solucionar si utilizas POO, donde podrias hacer que los datos sean atributos de la clase y por lo tanto compartidos a lo largo del codigo de la clase.


« Última modificación: 24 Marzo 2023, 21:57 pm por Locura_23 » En línea

Sk9ITk5Z


Desconectado Desconectado

Mensajes: 2.306



Ver Perfil WWW
Re: Función en Python
« Respuesta #2 en: 24 Marzo 2023, 23:15 pm »

Hola, tu problema es que las variables no son accesibles desde el metodo alta(), además no veo que utilices StringVar(), por lo que sé, el componente Entry tiene que asociarse a una variable tipo StringVar() para que puedas guardar el contenido del entry.
Entonces lo que tenes que hacer es guardar el contenido que el usuario introduce en el componente Entry con una variable StringVar() y luego en el evento del botón de 'dar alta' le tienes que pasar la referencia a la función que procesa el evento y además el CONTENIDO de Entry.
Fijate este ejemplo muy simple:

Código
  1. import tkinter
  2.  
  3. def evento_enviar(entradaNombre):
  4.    print(f'Usuario ingresó: {entradaNombre.get()}')
  5.  
  6. def main():
  7.    ventana = tkinter.Tk()
  8.    ventana.geometry('600x400')
  9.  
  10.    tkinter.Label(ventana, text='Ingrese su nombre --> ').grid(row=0, column=0)
  11.  
  12.    entradaNombre = tkinter.StringVar()
  13.  
  14.    tkinter.Entry(ventana, width=30, textvariable=entradaNombre).grid(row=0, column=1)
  15.  
  16.    tkinter.Button(ventana, text='Enviar',
  17.        command=lambda: evento_enviar(entradaNombre)).grid(row=0, column=2)
  18.  
  19.    ventana.mainloop()
  20.  
  21. if __name__ == '__main__':
  22.    main()
  23.  

Por ultimo nota que esto tambien se podria solucionar si utilizas POO, donde podrias hacer que los datos sean atributos de la clase y por lo tanto compartidos a lo largo del codigo de la clase.

Gracias por responder a lo que veo solo es una manera diferente de hacerlo, ya hice las modificaciones que me diste pero el problema es el mismo en la linea 42 dice variable no definida, te pego el código completo:

Código
  1. import tkinter
  2. from tkinter import *
  3. import sqlite3
  4.  
  5. # Crear una ventana principal
  6. ventana = tkinter.Tk()
  7. ventana.title("Entorno Gráfico")
  8. ventana.geometry("500x250")
  9.  
  10. # Crear la función para el boton Cliente
  11. def clientes():
  12.    ventana2 = tkinter.Toplevel(ventana)
  13.    ventana2.title("Alta de Clientes")
  14.    ventana2.geometry("500x250")
  15.  
  16.    # Crear etiquetas
  17.    tkinter.Label(ventana2, text='ID:').grid(row=0, column=0)
  18.    tkinter.Label(ventana2, text='Nombre:').grid(row=1, column=0)
  19.    tkinter.Label(ventana2, text='Direccion:').grid(row=2, column=0)
  20.    tkinter.Label(ventana2, text='Telefono').grid(row=3, column=0)
  21.  
  22.    # Crear cuadros de texto
  23.    cuadroID = tkinter.StringVar()
  24.    tkinter.Entry(ventana2, width=30, textvariable=cuadroID).grid(row=0, column=1)
  25.  
  26.    cuadroNombre = tkinter.StringVar()
  27.    tkinter.Entry(ventana2, width=30, textvariable=cuadroNombre).grid(row=1, column=1)
  28.  
  29.    cuadroDireccion = tkinter.StringVar()
  30.    tkinter.Entry(ventana2, width=30, textvariable=cuadroDireccion).grid(row=2, column=1)
  31.  
  32.    cuadroTelefono = tkinter.StringVar()
  33.    tkinter.Entry(ventana2, width=30, textvariable=cuadroTelefono).grid(row=3, column=1)
  34.  
  35.    # Crear botones
  36.    tkinter.Button(ventana2, text='Dar de Alta',command=alta).grid(row=4, column=2)
  37.    tkinter.Button(ventana2, text='Dar de Baja',command=baja).grid(row=4, column=1)
  38.  
  39.  
  40. # Crear la función para el boton Alta
  41. def alta():
  42.    id_cliente = cuadroID.get()
  43.    nombre_cliente = cuadroNombre.get()
  44.    direccion_cliente = cuadroDireccion.get()
  45.    telefono_cliente = cuadroTelefono.get()
  46.  
  47.    # Agregar los datos a la tabla de la base de datos
  48.    datos = [id_cliente, nombre_cliente, direccion_cliente, telefono_cliente]
  49.    cursor.execute("INSERT INTO tabla_clientes VALUES (?, ?, ?, ?)", datos)
  50.    conexion.commit()
  51.  
  52. # Crear la función para el boton Baja
  53. def baja():
  54.    id_cliente = cuadroID.get()
  55.    cursor.execute("DELETE FROM tabla_clientes WHERE id = ?", [id_cliente])
  56.    conexion.commit()
  57.  
  58. # Crear el boton Clientes
  59. botonClientes = Button(ventana, text="Clientes", command=clientes)
  60. botonClientes.grid(row=0, column=0)
  61.  
  62. # Crear la conexión con la base de datos
  63. conexion = sqlite3.connect("base_datos.db")
  64. cursor = conexion.cursor()
  65.  
  66. # Iniciar el programa
  67. ventana.mainloop()
  68.  

En línea

Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.
Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: Función en Python
« Respuesta #3 en: 25 Marzo 2023, 01:29 am »

mm ya veo, pues en realidad el problema sigue siendo este: el alcance de tus variables o donde las variables pueden utilizarse, tenes que organizar tu codigo en bloques para que te guies qué datos le estas enviando a las funciones.

Python no te impone ninguna forma de codear pero en general siempre es mejor utilizar una estructura en tus programas. Es decir, tendrias que organizar tu codigo en funciones o clases.

considera este refactor, le agregue las explicaciones en forma de comentarios, la funcion main() es la principal y llama agregar_cliente, en agregar_cliente se ingresan los datos pero a diferencia de antes, una mejor opcion es encapsularlos en una unidad tipo cliente, por ejemplo un diccionario. Este cliente (encapsulado) se manda a la funcion alta o baja, de manera que estas funciones pueden procesar al cliente.

pruebalo y me comentas si tienes dudas:

Código
  1. import tkinter
  2. import sqlite3
  3. '''from tkinter import * esto puede traer problemas, te conviene importar solo
  4. lo que necesitas usar'''
  5.  
  6. # Crear la función para el boton Cliente
  7. def agregar_cliente(ventana):
  8.    # Crear etiquetas
  9.    tkinter.Label(ventana, text='ID:').grid(row=1, column=0)
  10.    tkinter.Label(ventana, text='Nombre:').grid(row=2, column=0)
  11.    tkinter.Label(ventana, text='Direccion:').grid(row=3, column=0)
  12.    tkinter.Label(ventana, text='Telefono').grid(row=4, column=0)
  13.  
  14.    # Crear cuadros de texto
  15.    cuadroID = tkinter.StringVar()
  16.    tkinter.Entry(ventana, width=30, textvariable=cuadroID).grid(row=1, column=1)
  17.  
  18.    cuadroNombre = tkinter.StringVar()
  19.    tkinter.Entry(ventana, width=30, textvariable=cuadroNombre).grid(row=2, column=1)
  20.  
  21.    cuadroDireccion = tkinter.StringVar()
  22.    tkinter.Entry(ventana, width=30, textvariable=cuadroDireccion).grid(row=3, column=1)
  23.  
  24.    cuadroTelefono = tkinter.StringVar()
  25.    tkinter.Entry(ventana, width=30, textvariable=cuadroTelefono).grid(row=4, column=1)
  26.  
  27.    '''cuando llamas al boton dar de alta, creas un diccionario o estructura de datos
  28.    del cliente, de manera que esta todo encapsulado en una unidad'''
  29.  
  30.    # Crear botones
  31.    tkinter.Button(ventana, text='Dar de Alta',
  32.            command=lambda: alta(
  33.                {
  34.                'id': cuadroID.get(),
  35.                'nombre': cuadroNombre.get(),
  36.                'direccion': cuadroDireccion.get(),
  37.                'telefono': cuadroTelefono.get()
  38.                }
  39.            )).grid(row=5, column=0)
  40.  
  41.    '''lo mismo en baja'''
  42.  
  43.    tkinter.Button(ventana, text='Dar de Baja',
  44.            command=lambda: baja(
  45.                {
  46.                'id': cuadroID.get(),
  47.                'nombre': cuadroNombre.get(),
  48.                'direccion': cuadroDireccion.get(),
  49.                'telefono': cuadroTelefono.get()
  50.                }
  51.            )).grid(row=5, column=1)
  52.  
  53.  
  54. # Crear la función para el boton Alta
  55. def alta(cliente):
  56.  
  57.    '''
  58.    id_cliente = cuadroID.get()
  59.    nombre_cliente = cuadroNombre.get()
  60.    direccion_cliente = cuadroDireccion.get()
  61.    telefono_cliente = cuadroTelefono.get()
  62.  
  63.    # Agregar los datos a la tabla de la base de datos
  64.    datos = [id_cliente, nombre_cliente, direccion_cliente, telefono_cliente]
  65.    cursor.execute("INSERT INTO tabla_clientes VALUES (?, ?, ?, ?)", datos)
  66.    conexion.commit()
  67.    '''
  68.  
  69.    '''la funcion alta recibe ya un cliente en forma de estructura de datos'''
  70.  
  71.    print(f'Se dara de alta: {cliente}')
  72.    print(f"Tiene ID:' {cliente['id']}")
  73.    print(f"Tiene nombre: {cliente['nombre']}")
  74.  
  75. # Crear la función para el boton Baja
  76. def baja(cliente):
  77.  
  78.    '''
  79.    id_cliente = cuadroID.get()
  80.    cursor.execute("DELETE FROM tabla_clientes WHERE id = ?", [id_cliente])
  81.    conexion.commit()
  82.    '''
  83.  
  84.    '''lo mismo la funcion baja'''
  85.    print(f'Se dara de baja: {cliente}')
  86.  
  87. def main():
  88.    # Crear una ventana principal
  89.    ventana = tkinter.Tk()
  90.    ventana.title("Entorno Gráfico")
  91.    ventana.geometry("500x250")
  92.  
  93.    # Crear la conexión con la base de datos
  94.    conexion = sqlite3.connect("base_datos.db")
  95.    cursor = conexion.cursor()
  96.  
  97.    '''aca llamas a la funcion agregar_cliente y le pasas la referencia
  98.    de la ventana padre'''
  99.    # Crear el boton Clientes
  100.    botonClientes = tkinter.Button(ventana, text="Clientes",
  101.            command=lambda:agregar_cliente(ventana) )
  102.  
  103.    botonClientes.grid(row=0, column=0)
  104.  
  105.    # Iniciar el programa
  106.    ventana.mainloop()
  107.  
  108. if __name__ == '__main__':
  109.    main()
En línea

Sk9ITk5Z


Desconectado Desconectado

Mensajes: 2.306



Ver Perfil WWW
Re: Función en Python
« Respuesta #4 en: 25 Marzo 2023, 18:47 pm »

mm ya veo, pues en realidad el problema sigue siendo este: el alcance de tus variables o donde las variables pueden utilizarse, tenes que organizar tu codigo en bloques para que te guies qué datos le estas enviando a las funciones.

Python no te impone ninguna forma de codear pero en general siempre es mejor utilizar una estructura en tus programas. Es decir, tendrias que organizar tu codigo en funciones o clases.

considera este refactor, le agregue las explicaciones en forma de comentarios, la funcion main() es la principal y llama agregar_cliente, en agregar_cliente se ingresan los datos pero a diferencia de antes, una mejor opcion es encapsularlos en una unidad tipo cliente, por ejemplo un diccionario. Este cliente (encapsulado) se manda a la funcion alta o baja, de manera que estas funciones pueden procesar al cliente.

pruebalo y me comentas si tienes dudas:

Código
  1. import tkinter
  2. import sqlite3
  3. '''from tkinter import * esto puede traer problemas, te conviene importar solo
  4. lo que necesitas usar'''
  5.  
  6. # Crear la función para el boton Cliente
  7. def agregar_cliente(ventana):
  8.    # Crear etiquetas
  9.    tkinter.Label(ventana, text='ID:').grid(row=1, column=0)
  10.    tkinter.Label(ventana, text='Nombre:').grid(row=2, column=0)
  11.    tkinter.Label(ventana, text='Direccion:').grid(row=3, column=0)
  12.    tkinter.Label(ventana, text='Telefono').grid(row=4, column=0)
  13.  
  14.    # Crear cuadros de texto
  15.    cuadroID = tkinter.StringVar()
  16.    tkinter.Entry(ventana, width=30, textvariable=cuadroID).grid(row=1, column=1)
  17.  
  18.    cuadroNombre = tkinter.StringVar()
  19.    tkinter.Entry(ventana, width=30, textvariable=cuadroNombre).grid(row=2, column=1)
  20.  
  21.    cuadroDireccion = tkinter.StringVar()
  22.    tkinter.Entry(ventana, width=30, textvariable=cuadroDireccion).grid(row=3, column=1)
  23.  
  24.    cuadroTelefono = tkinter.StringVar()
  25.    tkinter.Entry(ventana, width=30, textvariable=cuadroTelefono).grid(row=4, column=1)
  26.  
  27.    '''cuando llamas al boton dar de alta, creas un diccionario o estructura de datos
  28.    del cliente, de manera que esta todo encapsulado en una unidad'''
  29.  
  30.    # Crear botones
  31.    tkinter.Button(ventana, text='Dar de Alta',
  32.            command=lambda: alta(
  33.                {
  34.                'id': cuadroID.get(),
  35.                'nombre': cuadroNombre.get(),
  36.                'direccion': cuadroDireccion.get(),
  37.                'telefono': cuadroTelefono.get()
  38.                }
  39.            )).grid(row=5, column=0)
  40.  
  41.    '''lo mismo en baja'''
  42.  
  43.    tkinter.Button(ventana, text='Dar de Baja',
  44.            command=lambda: baja(
  45.                {
  46.                'id': cuadroID.get(),
  47.                'nombre': cuadroNombre.get(),
  48.                'direccion': cuadroDireccion.get(),
  49.                'telefono': cuadroTelefono.get()
  50.                }
  51.            )).grid(row=5, column=1)
  52.  
  53.  
  54. # Crear la función para el boton Alta
  55. def alta(cliente):
  56.  
  57.    '''
  58.    id_cliente = cuadroID.get()
  59.    nombre_cliente = cuadroNombre.get()
  60.    direccion_cliente = cuadroDireccion.get()
  61.    telefono_cliente = cuadroTelefono.get()
  62.  
  63.    # Agregar los datos a la tabla de la base de datos
  64.    datos = [id_cliente, nombre_cliente, direccion_cliente, telefono_cliente]
  65.    cursor.execute("INSERT INTO tabla_clientes VALUES (?, ?, ?, ?)", datos)
  66.    conexion.commit()
  67.    '''
  68.  
  69.    '''la funcion alta recibe ya un cliente en forma de estructura de datos'''
  70.  
  71.    print(f'Se dara de alta: {cliente}')
  72.    print(f"Tiene ID:' {cliente['id']}")
  73.    print(f"Tiene nombre: {cliente['nombre']}")
  74.  
  75. # Crear la función para el boton Baja
  76. def baja(cliente):
  77.  
  78.    '''
  79.    id_cliente = cuadroID.get()
  80.    cursor.execute("DELETE FROM tabla_clientes WHERE id = ?", [id_cliente])
  81.    conexion.commit()
  82.    '''
  83.  
  84.    '''lo mismo la funcion baja'''
  85.    print(f'Se dara de baja: {cliente}')
  86.  
  87. def main():
  88.    # Crear una ventana principal
  89.    ventana = tkinter.Tk()
  90.    ventana.title("Entorno Gráfico")
  91.    ventana.geometry("500x250")
  92.  
  93.    # Crear la conexión con la base de datos
  94.    conexion = sqlite3.connect("base_datos.db")
  95.    cursor = conexion.cursor()
  96.  
  97.    '''aca llamas a la funcion agregar_cliente y le pasas la referencia
  98.    de la ventana padre'''
  99.    # Crear el boton Clientes
  100.    botonClientes = tkinter.Button(ventana, text="Clientes",
  101.            command=lambda:agregar_cliente(ventana) )
  102.  
  103.    botonClientes.grid(row=0, column=0)
  104.  
  105.    # Iniciar el programa
  106.    ventana.mainloop()
  107.  
  108. if __name__ == '__main__':
  109.    main()


Gracias lo pruebo y te aviso...
En línea

Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.
Sk9ITk5Z


Desconectado Desconectado

Mensajes: 2.306



Ver Perfil WWW
Re: Función en Python
« Respuesta #5 en: 29 Marzo 2023, 01:31 am »

Buenas no me dejo modificar el mensaje anterior, ya me funciono lo del tema de las variables como me lo mostraste, solo para el tema de la conexión con la base de datos lo tuve que mover a la parte de arriba para que me los tomara en las funciones, pego el código para los que estén aprendiendo como yo, vean lo que tuve que hacer.}

Código
  1. import tkinter
  2. from tkinter import *
  3. import mysql.connector
  4.  
  5. conexion = mysql.connector.connect(host="localhost",user="???",passwd="?????",database="prueba")
  6. cursor = conexion.cursor()
  7.  
  8.  

por cierto me da un error a la hora de agregar la información a la tabla pero ya estema de mySQL.

Código
  1. line 645, IN prepare_for_mysql
  2.    RESULT = SELF._cmysql.convert_to_mysql(*params)
  3. _mysql_connector.MySQLInterfaceError: Python TYPE SET cannot be converted
  4.  

EDITO:

el error que me daba del sql era por como recibía la información y de como la insertaba, les pego el código de como lo solucione:

Código
  1. def alta(cliente):
  2.    datos = [cliente['ID'], cliente['Nombre'], cliente['Direccion'], cliente['Telefono']]
  3.    cursor.execute("INSERT INTO clientes VALUES (%s, %s, %s, %s)", datos)
  4.    conexion.commit()
  5.    tkinter.messagebox.showinfo('Agregar', 'Cliente dado de alta')
  6.  

« Última modificación: 30 Marzo 2023, 15:14 pm por Sk9ITk5Z » En línea

Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.
Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: Función en Python
« Respuesta #6 en: 29 Marzo 2023, 02:52 am »

Oye pues bien que te funcionó lo de python, saludos  ;D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines