Aplicacion Python CRUD con tkinter y sqlite

python_logo

Este es el código de una aplicación muy básica creada en python, que  crea, lee, actualiza y borra registros empleando una base de datos sqlite.

Intro

En programación el término CRUD, hace referencia a Create, Read, Update, Delete generalmente en una base de datos. Tengo idea mas adelante, de explicar y documentar un poco mas este código.

La libreria tkinter que importamos, dotará a nuestra aplicación de entorno gráfico.

El Código:

from tkinter import *
from tkinter import messagebox
import sqlite3

root=Tk()
root.title("Aplicación con B.D")
root.geometry("350x300")

miId=StringVar()
miNombre=StringVar()
miApellido=StringVar()
miPass=StringVar()
miDireccion=StringVar()

def conexionBBDD():
    

    miConexion=sqlite3.connect("UsuariosDB")
    miCursor=miConexion.cursor()
    
    try:
        
        miCursor.execute('''
            CREATE TABLE DATOSUSUARIOS (
            ID INTEGER PRIMARY KEY AUTOINCREMENT,
            NOMBRE_USUARIO VARCHAR(50),
            PASSWORD VARCHAR(50),
            APELLIDO VARCHAR(20),
            DIRECCION VARCHAR(50))
            
            ''')
        #COMENTARIOS VARCHAR(100))
        
        
        messagebox.showinfo("BBDD","BBDD creada con éxito")
    
    except:
        
        messagebox.showwarning("¡Atención!","La BBDD ya existe")
    
def salirAplicacion():
    
    valor=messagebox.askquestion("Salir","¿Deseas salir de la aplicación?")
    if valor=="yes":
        root.destroy()
        
def limpiarCampos():
    miId.set("")
    miNombre.set("")
    miApellido.set("")
    miDireccion.set("")
    miPass.set("")
    #textoComentario.delete(1,0,END)
    
    
def mensaje():
    print("pulsaste!")

    
    
def crear():
    miConexion=sqlite3.connect("UsuariosDB")
    miCursor=miConexion.cursor()
    
    datos=miNombre.get(),miPass.get(),miApellido.get(),miDireccion.get()
    miCursor.execute("INSERT INTO DATOSUSUARIOS VALUES(NULL,?,?,?,?)", (datos))
    
    miConexion.commit()
    
    messagebox.showinfo("BBDD","Registro insertado con éxito")

"""  El siguiente codigo favorece sql injection, y es inseguro. Aunque funciona

    def crear():
    miConexion=sqlite3.connect("UsuariosDB")
    miCursor=miConexion.cursor()
    miCursor.execute("INSERT INTO DATOSUSUARIOS VALUES(NULL,'"+miNombre.get()+
                     
                     "','" + miPass.get() + 
                     "','" + miApellido.get()+
                     "','" + miDireccion.get() + "')")
                    
    miConexion.commit()
    
    messagebox.showinfo("BBDD","Registro insertado con éxito")
    
"""
    
    
def leer():
    
    miConexion=sqlite3.connect("UsuariosDB")
    miCursor=miConexion.cursor()
    miCursor.execute("SELECT * FROM DATOSUSUARIOS WHERE ID=" +miId.get())
    elUsuario=miCursor.fetchall()
    
    for usuario in elUsuario:
        
        miId.set(usuario[0])
        miNombre.set(usuario[1])
        miApellido.set(usuario[3])
        miDireccion.set(usuario[4])
    
    
    miConexion.commit()

    
def actualizar():
    
    miConexion=sqlite3.connect("UsuariosDB")
    miCursor=miConexion.cursor()
    
    datos=miNombre.get(),miPass.get(),miApellido.get(),miDireccion.get()
    
    miCursor.execute("UPDATE DATOSUSUARIOS SET NOMBRE_USUARIO=?, PASSWORD=?, APELLIDO=?, DIRECCION=? "+
    
    "WHERE ID=" + miId.get(),(datos))
    
    
    
    """" Siguiente codigo susceptible de SQL Inyection
    
    
    miCursor.execute("UPDATE DATOSUSUARIOS SET NOMBRE_USUARIO='"+miNombre.get()+
        "', PASSWORD='" + miPass.get() + 
        "', APELLIDO='" + miApellido.get() +
        "', DIRECCION='" + miDireccion.get() +
        "' WHERE ID=" + miId.get())
        
    """
    
    miConexion.commit()
    
    messagebox.showinfo("BBDD","Registro actualizado con éxito")
    
    
def borrar():
    
    miConexion=sqlite3.connect("UsuariosDB")
    miCursor=miConexion.cursor()
    miCursor.execute("DELETE FROM DATOSUSUARIOS WHERE ID=" +miId.get())
                    
    miConexion.commit()
    
    messagebox.showinfo("BBDD","Registro borrado con éxito")
    
    
menubar=Menu(root)
menubasedat=Menu(menubar, tearoff=0)
menubasedat.add_command(label="Conectar", command=conexionBBDD)
menubasedat.add_command(label="Salir", command=salirAplicacion)
menubar.add_cascade(label="BBDD", menu=menubasedat)


menuborrar=Menu(menubar, tearoff=0)
menuborrar.add_command(label="Borrar campos", command=limpiarCampos)
menubar.add_cascade(label="Borrar",menu=menuborrar )

crud=Menu(menubar, tearoff=0)
crud.add_command(label="Añadir", command=crear)
crud.add_command(label="Leer", command=leer)
crud.add_command(label="Actualizar", command=actualizar)
crud.add_command(label="Borrar", command=borrar)
menubar.add_cascade(label="CRUD", menu=crud)


ayudamenu=Menu(menubar, tearoff=0)
ayudamenu.add_command(label="Licencia", command=mensaje)
ayudamenu.add_command(label="Acerca", command=mensaje)
menubar.add_cascade(label="Ayuda", menu=ayudamenu)

root.config(menu=menubar)

l1=Label(root, text="Id: ")
l1.grid(column=0, row=1)


e1=Entry(root, textvariable=miId)
e1.grid(column=1, row=1)

l2=Label(root, text="Nombre: ")
l2.grid(column=0, row=2)


e2=Entry(root, textvariable=miNombre)
e2.grid(column=1, row=2)

l3=Label(root, text="Password: ")
l3.grid(column=0, row=3)

e3=Entry(root,textvariable=miPass)
e3.grid(column=1, row=3)

# textvariable="password", show="*"

l4=Label(root, text="Apellido: ")
l4.grid(column=0, row=4)

e4=Entry(root,textvariable=miApellido)
e4.grid(column=1, row=4)

l5=Label(root, text="Dirección: ")
l5.grid(column=0, row=5)

e5=Entry(root,textvariable=miDireccion)
e5.grid(column=1, row=5)

#l6=Label(root, text="Comentario: ", textvariable=textoComentario)
#l6.grid(column=0, row=6)

#l6=Text(root, width=20, height=6)
#l6.place(x=75,y=110)



b1=Button(root, text="Create", command=crear)
b1.place(x=40,y=250)

b2=Button(root, text="Read", command=leer)
b2.place(x=90,y=250)

b3=Button(root, text="Update", command=actualizar)
b3.place(x=130,y=250)

b4=Button(root, text="Delete", command=borrar)
b4.place(x=180,y=250)

root.mainloop()




Be the first to comment

Leave a Reply

Tu dirección de correo no será publicada.


*