✏️
Ejercicio 3 · Python + SQLite

Modificar productos del kiosco 🔧

Ahora vamos a poder corregir el precio de un producto que ya existe en la base de datos, sin borrarlo y volver a cargarlo.

🔁 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 y agrega productos.

🎯 Objetivo del ejercicio

Aprender a actualizar datos en SQLite desde Python. Vamos a agregar casillas para elegir el id del producto y su precio nuevo, y un botón "Modificar precio" que actualice ese registro en la base con la instrucción UPDATE.

💡

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

🔢Escribo el id y el precio nuevo
💾UPDATE modifica esa fila
👀Vuelvo a mostrar la lista
🔑 La gran novedad de este ejercicio: el UPDATE necesita un WHERE para saber qué fila modificar. Si te olvidás del WHERE, ¡se modifican todos los productos a la vez!
1

Pensar qué necesitamos ¿Cómo le decimos a la base qué fila cambiar?

Paso 1 Identificar el producto

Para modificar un producto necesitamos saber cuál es. La forma más segura es usar su id, porque nunca se repite entre productos.

🔎 ¿No te acordás el id de un producto? Apretá primero "Mostrar productos" y anotá el número que corresponde. (Desafío: más abajo te proponemos mostrar también el id en la lista).
2

Escribir el código completo En violeta, 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 violeta son las novedades:

kiosco.py
# ==========================================================
# APLICACIÓN: Mostrar, AGREGAR y MODIFICAR 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 id, producto, precio FROM productos")
    filas = cursor.fetchall()

    conexion.close()

    cuadro_texto.delete("1.0", tk.END)
    for fila in filas:
        id_producto = fila[0]
        producto = fila[1]
        precio = fila[2]
        cuadro_texto.insert(tk.END, f"[{id_producto}] {producto} - ${precio}\n")


# ----------------------------------------------------------
# Función que AGREGA un producto a la base (ya la conocés)
# ----------------------------------------------------------
def agregar_producto():
    nombre = casilla_nombre.get()
    precio = casilla_precio.get()

    conexion = sqlite3.connect("kiosco.db")
    cursor = conexion.cursor()

    cursor.execute("INSERT INTO productos (producto, precio) VALUES (?, ?)",
                   (nombre, precio))

    conexion.commit()
    conexion.close()

    casilla_nombre.delete(0, tk.END)
    casilla_precio.delete(0, tk.END)

    mostrar_productos()


# ----------------------------------------------------------
# NUEVA función: MODIFICA el precio de un producto existente
# ----------------------------------------------------------
def modificar_precio():
    # Leemos el id del producto y el precio nuevo
    id_producto = casilla_id.get()
    precio_nuevo = casilla_precio_nuevo.get()

    # Nos conectamos a la base de datos
    conexion = sqlite3.connect("kiosco.db")
    cursor = conexion.cursor()

    # UPDATE cambia el precio SOLO de la fila con ese id
    # Sin el WHERE, ¡se modificarían TODOS los productos!
    cursor.execute("UPDATE productos SET precio = ? WHERE id = ?",
                   (precio_nuevo, id_producto))

    # MUY IMPORTANTE: guardar los cambios en la base
    conexion.commit()
    conexion.close()

    # Vaciamos las casillas para poder modificar otro producto
    casilla_id.delete(0, tk.END)
    casilla_precio_nuevo.delete(0, tk.END)

    # Volvemos a mostrar la lista, ya con el precio actualizado
    mostrar_productos()


# ----------------------------------------------------------
# Creación de la ventana con tkinter
# ----------------------------------------------------------
ventana = tk.Tk()
ventana.title("Kiosco")
ventana.geometry("320x560")     # 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 ---
etiqueta_nombre = tk.Label(ventana, text="Nombre del producto:")
etiqueta_nombre.pack()
casilla_nombre = tk.Entry(ventana)
casilla_nombre.pack()

etiqueta_precio = tk.Label(ventana, text="Precio:")
etiqueta_precio.pack()
casilla_precio = tk.Entry(ventana)
casilla_precio.pack()

boton_agregar = tk.Button(ventana, text="Agregar producto",
                          command=agregar_producto)
boton_agregar.pack(pady=10)

# --- Casillas y botón para MODIFICAR el precio ---
# Casilla para el id del producto
etiqueta_id = tk.Label(ventana, text="Id del producto a modificar:")
etiqueta_id.pack()
casilla_id = tk.Entry(ventana)
casilla_id.pack()

# Casilla para el precio nuevo
etiqueta_precio_nuevo = tk.Label(ventana, text="Precio nuevo:")
etiqueta_precio_nuevo.pack()
casilla_precio_nuevo = tk.Entry(ventana)
casilla_precio_nuevo.pack()

# Botón que llama a la función modificar_precio
boton_modificar = tk.Button(ventana, text="Modificar precio",
                           command=modificar_precio)
boton_modificar.pack(pady=10)

ventana.mainloop()

Paso 3 Probar la aplicación

Ejecutá el programa y presioná "Mostrar productos" para ver los ids. Elegí uno, escribí un precio nuevo y presioná "Modificar precio". El precio de ese producto debería actualizarse en 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 precio tiene que estar actualizado.
🆕

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

📊

Las 3 instrucciones SQL que ya conocés SELECT, INSERT y ahora UPDATE

Instrucción¿Para qué sirve?¿Necesita commit()?
SELECTLeer datos existentesNo
INSERTAgregar una fila nueva
UPDATEModificar una fila existente
?

Para pensar y responder

🤔 Reflexionamos

  1. ¿Qué pasaría si ejecutamos UPDATE productos SET precio = 100 sin el WHERE?
  2. ¿Por qué usamos el id para identificar el producto y no el nombre?
  3. En cursor.execute("UPDATE productos SET precio = ? WHERE id = ?", (precio_nuevo, id_producto)), ¿qué signo ? se reemplaza por precio_nuevo y cuál por id_producto?
  4. Si escribís un id que no existe en la tabla, ¿qué pasa cuando presionás "Modificar precio"? ¿Da error?

🚀 Desafíos opcionales