Ahora la aplicación no solo leerá los productos: también podrá cargar uno nuevo en la base de datos desde la ventana.
Este ejercicio continúa el anterior. Necesitás tener listos la base kiosco.db (con la tabla productos) y tu archivo kiosco.py que ya muestra los datos.
Aprender a insertar datos en SQLite desde Python. Vamos a agregar dos casillas para escribir el nombre y el precio, y un botón "Agregar producto" que guarde ese producto en la base con la instrucción INSERT.
conexion.commit() para guardar los cambios. Sin commit, el producto no se guarda de verdad.
Para cargar un producto necesitamos que el usuario pueda escribir dos cosas:
En tkinter, la casilla para escribir se llama Entry.
Reemplazá tu kiosco.py por este código. Las líneas resaltadas en verde son las novedades:
# ========================================================== # APLICACIÓN: Mostrar y AGREGAR productos del kiosco # La base "kiosco.db" ya existe (creada con DB Browser) # ========================================================== import tkinter as tk # Para la ventana, botones y casillas import sqlite3 # Para trabajar con la base de datos # ---------------------------------------------------------- # Función que LEE los productos y los muestra (ya la conocés) # ---------------------------------------------------------- def mostrar_productos(): conexion = sqlite3.connect("kiosco.db") cursor = conexion.cursor() cursor.execute("SELECT producto, precio FROM productos") filas = cursor.fetchall() conexion.close() cuadro_texto.delete("1.0", tk.END) for fila in filas: producto = fila[0] precio = fila[1] cuadro_texto.insert(tk.END, f"{producto} - ${precio}\n") # ---------------------------------------------------------- # NUEVA función: AGREGA un producto a la base de datos # ---------------------------------------------------------- def agregar_producto(): # Leemos lo que el usuario escribió en las casillas nombre = casilla_nombre.get() precio = casilla_precio.get() # Nos conectamos a la base de datos conexion = sqlite3.connect("kiosco.db") cursor = conexion.cursor() # Guardamos el nuevo producto con INSERT # Los signos ? se reemplazan por los datos de la casilla cursor.execute("INSERT INTO productos (producto, precio) VALUES (?, ?)", (nombre, precio)) # MUY IMPORTANTE: guardar los cambios en la base conexion.commit() conexion.close() # Vaciamos las casillas para poder cargar otro producto casilla_nombre.delete(0, tk.END) casilla_precio.delete(0, tk.END) # Volvemos a mostrar la lista, ya con el nuevo producto mostrar_productos() # ---------------------------------------------------------- # Creación de la ventana con tkinter # ---------------------------------------------------------- ventana = tk.Tk() ventana.title("Kiosco") ventana.geometry("320x420") # Un poco más alta que antes titulo = tk.Label(ventana, text="Lista de productos") titulo.pack(pady=10) cuadro_texto = tk.Text(ventana, width=32, height=8) cuadro_texto.pack() boton = tk.Button(ventana, text="Mostrar productos", command=mostrar_productos) boton.pack(pady=10) # --- Casillas y botón para AGREGAR un producto --- # Casilla para el nombre etiqueta_nombre = tk.Label(ventana, text="Nombre del producto:") etiqueta_nombre.pack() casilla_nombre = tk.Entry(ventana) casilla_nombre.pack() # Casilla para el precio etiqueta_precio = tk.Label(ventana, text="Precio:") etiqueta_precio.pack() casilla_precio = tk.Entry(ventana) casilla_precio.pack() # Botón que llama a la función agregar_producto boton_agregar = tk.Button(ventana, text="Agregar producto", command=agregar_producto) boton_agregar.pack(pady=10) ventana.mainloop()
Ejecutá el programa. Escribí un nombre y un precio en las casillas, y presioná "Agregar producto". El producto nuevo debería aparecer al final de la lista. 🎉
kiosco.db con DB Browser y mirá la pestaña "Examinar datos". El producto nuevo tiene que estar ahí.
Entry → es la casilla donde el usuario escribe. Con .get() leemos lo que escribió.INSERT INTO ... VALUES (?, ?) → agrega una fila nueva a la tabla.? son "huecos" que se completan con los datos. Es la forma segura de insertar datos.commit() → guarda los cambios. Sin esta línea, el producto no se guarda..delete(0, tk.END) → limpia la casilla para cargar el siguiente.commit(), pero en la que agrega datos sí?casilla_nombre.get()?mostrar_productos() del final de la función agregar_producto? ¿El producto se guardaría igual?if antes del INSERT.tk.Label o messagebox.showinfo.mostrar_productos() antes de mainloop().