Ejercicio 2 · Python + SQLite

Agregar productos al kiosco 🛒

Ahora la aplicación no solo leerá los productos: también podrá cargar uno nuevo en la base de datos desde la ventana.

🔁 Antes de empezar

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.

🎯 Objetivo del ejercicio

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.

💡

La idea en 3 pasos Qué va a hacer nuestro nuevo botón

⌨️Escribo nombre y precio
💾INSERT guarda en la base
👀Vuelvo a mostrar la lista
🔑 La gran novedad respecto al ejercicio anterior: cuando modificamos la base (INSERT), hay que usar conexion.commit() para guardar los cambios. Sin commit, el producto no se guarda de verdad.
1

Preparar la ventana Agregamos casillas para escribir los datos

Paso 1 Pensar qué necesitamos

Para cargar un producto necesitamos que el usuario pueda escribir dos cosas:

En tkinter, la casilla para escribir se llama Entry.

2

Escribir el código completo En verde, todo lo nuevo respecto al ejercicio anterior

Paso 2 El programa completo

Reemplazá tu kiosco.py por este código. Las líneas resaltadas en verde son las novedades:

kiosco.py
# ==========================================================
# 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()

Paso 3 Probar la aplicación

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. 🎉

🔎 Para comprobar que se guardó de verdad: cerrá la app, abrí kiosco.db con DB Browser y mirá la pestaña "Examinar datos". El producto nuevo tiene que estar ahí.
🆕

¿Qué aprendimos de nuevo? Las piezas clave de este ejercicio

?

Para pensar y responder

🤔 Reflexionamos

  1. ¿Por qué en la función que lee datos no usamos commit(), pero en la que agrega datos sí?
  2. ¿Qué instrucción SQL usamos para leer y cuál para agregar? Nombralas.
  3. ¿Para qué sirve casilla_nombre.get()?
  4. ¿Qué pasaría si borramos la línea mostrar_productos() del final de la función agregar_producto? ¿El producto se guardaría igual?

🚀 Desafíos opcionales