Login en Tkinter y SQLite3

Login en Tkinter y SQLite3
Login en Tkinter y SQLite3

Esta entrada nace de una consulta realizada en Twitter (@PythonDiario), la consulta fue "si en el blog existía una entrada sobre el ingreso de usuario realizada con Python y SQLite3", la respuesta fue un "NO", no había nada sobre ingreso de usuarios y contraseñas (Login), así que me puse a buscar un poco de información, a escribir un poco de código para no oxidarme y listo, les comparto el sencillo Login que realice con Python, Tkinter y SQLite3.

Se aceptan todo tipo de sugerencias sobre seguridad, maneras de implementarlo, etc. Fue algo que hice de manera rápida y sencilla.


Repositorio en GitHub: https://github.com/pythondiario/Login-con-Tkinter-y-Python

Pasos para crear el Login

1 - Lo primero que hice fue crear una base de datos en SQLite3 con una tabla llamada "usuarios" (Si no tienes mucha idea de como utilizar SQLite3 y Python puedes pasarte por esta entrada: Python y SQLite3).
Para crear la base de datos de forma rápida utilice sqliteman (http://sqliteman.yarpen.cz/).
La tabla "usuarios" está compuesta por las columnas:

  • Usuario (Tipo text y Not Null)
  • pass (Tipo text y Not Null)

Dentro de Sqliteman agregué dos usuarios y sus respectivas contraseñas (acá aclaro que las contraseñas están en texto plano, no hice ninguna codificación de seguridad)

2 - Luego de estar creada la Base de Datos con los usuarios de prueba, echamos mano al código:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# www.pythondiario.com

from Tkinter import *
from tkMessageBox import *
import sqlite3

ventana = Tk()
ventana.title ("------- Login Python Diario -------")
ventana.geometry ("350x150+500+250")
Label(ventana, text = "Usuario:").pack()
caja1 = Entry(ventana)
caja1.pack()

Label(ventana, text = "Contraseña:").pack()
caja2 = Entry(ventana, show = "*")
caja2.pack()

def login():
 # Connect to database
 db = sqlite3.connect('/home/diego123/Escritorio/login.db')
 c = db.cursor()
 
 usuario = caja1.get()
 contr = caja2.get()
 
 c.execute('SELECT * FROM usuarios WHERE usuario = ? AND pass = ?', (usuario, contr))
 
 if c.fetchall():
  showinfo(title = "Login correcto", message = "Usuario y contraseña correctos")
 else:
  showerror(title = "Login incorrecto", message = "Usuario o contraseña incorrecta")
  
 c.close()

Button (text = "Login", command = login).pack()


ventana.mainloop()

Login con Tkinter y Python
Login con Tkinter y Python

Ingreso correcto
Ingreso correcto

Ingreso incorrecto
Ingreso incorrecto

Análisis del código

En la primera parte del código importamos las librerías necesarias para crear la interfaz gráfica y poder trabajar con la base de datos:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# www.pythondiario.com

from Tkinter import *
from tkMessageBox import *
import sqlite3

Luego creamos la interfaz en Tkinter que vamos a utilizar para autenticarnos:

ventana = Tk()
ventana.title ("------- Login Python Diario -------")
ventana.geometry ("350x150+500+250")
Label(ventana, text = "Usuario:").pack()
caja1 = Entry(ventana)
caja1.pack()

Label(ventana, text = "Contraseña:").pack()
caja2 = Entry(ventana, show = "*")
caja2.pack()

La función def login() lo que hace es comprobar cuando se pulse el botón "Login", que el usuario que se ingresa se corresponda con la contraseña ingresada. En caso afirmativo mostrará un mensaje de éxito, en el caso de que no coincida el usuario o la contraseña, mostrará un mensaje de error.
En el inicio de la función se crea la conexión con la base de datos, luego se hace una SELECT para obtener los datos y al final se cierra la conexión

def login():
 # Connect to database
 db = sqlite3.connect('/home/diego123/Escritorio/login.db')
 c = db.cursor()
 
 usuario = caja1.get()
 contr = caja2.get()
 
 c.execute('SELECT * FROM usuarios WHERE usuario = ? AND pass = ?', (usuario, contr))
 
 if c.fetchall():
  showinfo(title = "Login correcto", message = "Usuario y contraseña correctos")
 else:
  showerror(title = "Login incorrecto", message = "Usuario o contraseña incorrecta")
  
 c.close()

Por último y no menos importante, hacemos que la ventana se muestre siempre en pantalla:

ventana.mainloop()

Esto es todo amigos!!! Espero sus críticas!!!

  1. Anónimo dice:

    Hola mi nombre es Moisés, quiero felicitarte por el trabajo que haces al publicar lo que has aprendido, que bueno mas que trabajo es tu pasión, una duda!! en Tkinter es posible aplicar estilos como css a los objetos de la GUI?, muchas gracias,

    1. PythonDiario dice:

      Hola Moises ,gracias por el comentario, por suerte ahora no soy yo solo, ya se han unido varios pythonistas para escribir en el blog ;). En cuanto a tu pregunta, puedes pasarte por este link: Widget Styling
      Quizá te sea de ayuda.
      Saludos

  2. Randall Jimenez dice:

    Diego Caraballo, grande hermano, la personas como ud que comparten conocimiento y enseñan a otros como yo que soy principiante, mis respetos. Ya estoy apuntado en el curso de Tkinter excedlente, TODO EXCELENTE

    1. PythonDiario dice:

      Gracias Randall por el comentario y por visitar el blog. Comentarios como el tuyo son los que motivan a seguir escribiendo. Saludos

  3. Anónimo dice:

    Cómo hago para que se registre el usuario, es decir, que ponga un nombre y una contraseña y lo guardé en una base de datos

    1. PythonDiario dice:

      Si estudias un poco el código de esta entrada y averiguas como hacer "Insert" en Sqlite vas a poder implementarlo. Más adelante crearé una entrada sobre el tema.
      Saludos

  4. Felipe de Andrade Correa dice:

    Muito Obrigado, me ajudou muito... Gracias !!!!!!!!!!!!

    1. PythonDiario dice:

      Excelente Felipe, gracias por comentar y pasarte por el blog. Saludos

  5. Shirke dice:

    Would love to see the article in english, i was needed to use google translate, but the code comments were still in language i don't know
    But great work

    1. PythonDiario dice:

      Thanks for visiting the blog

  6. Unknown dice:

    muy bueno, tengo una duda, con diccionario y archivo plano, se puede trabjar?, es que soy nuevo en esto...
    hice este code, pero falta algo, porque no da el print, aunque tenga registrado el usuario en el archivo plano, desde ya muchas gracias...
    mi CODE:
    from Tkinter import *
    from tkMessageBox import *

    ventana = Tk()
    ventana.title ("--- Identificate antes de Comenzar ---")
    ventana.geometry ("350x150+500+250")
    Label(ventana, text = "Usuario:").pack()
    caja1 = Entry(ventana)
    caja1.pack()

    def login():
    usuario = caja1.get()
    k=True
    c=0
    dic={}
    reg=[]
    a=open('usuarios.txt','a+')
    L=a.readline()
    while L!="":
    reg=L.split(",")
    dic[c] = {'codU':int(reg[0]),'NyA':reg[1],'Usu':reg[2],'PW':reg[3]}
    c=c+1
    L=a.readline()
    a.close

    while usuario!= "":
    i=0
    while i<c:
    CU=dic[i]['codU']
    if usuario == CU:
    print "asd"
    Button (text = "Entrar", command=login).pack()
    ventana.mainloop()

  7. Unknown dice:

    Hola, muy bueno tu aporte, realmente lo necesitaba mucho, me funciono todo menos los mensajes, me salta el error "NameError: name 'showinfo' is not defined", porque sera?

    1. Unknown dice:

      Trata con esto:
      from tkinter import messagebox
      Y los mensajes los generas de esta manera:
      messagebox.showinfo(mesage="tumensaje", title="titulo de tu ventana")

  8. Esther dice:

    Este comentario ha sido eliminado por el autor.

  9. Esther dice:

    Excelente, muchas gracias. Anduve buscando por un buen rato y este ejemplo me funciono muy bien.

  10. Ramiro Velazquez dice:

    Espero y alguien me lea hice un login como este el problema es que quiero agregar una funcion de cerrar sesion pero que no me cierre las ventanas si no que me mande otra ves al login pero lo hago asi y no corre a como debe de ser

  11. Robert dice:

    Excelente trabajo y explicación. Código sin desperdicios, estaba buscando algo así para un sistema de biblioteca que tengo, solo agregaré lo de crear usuario. Gracias por tu aporte.

  12. Anónimo dice:

    Excelente... Soy nueva en python y me ha gustado mucho. He estado buscando como hacer un login para una base de datos y no hbia encontrad gran cosa.

    He estado buscando tambien lectura para el codigo de barras PDF417 y ha sido imposible... En cuentro solo codigos para crear un PDF417 pero no para leerlos. Si de pronto alguien sabe o conoce alguna página que me guíe un poco, le agradecería

  13. José fer dice:

    Hola buenas noches el aporte está genial yo soy nuevo y me ayuda mucho, pero quería ver si me podías ayudar para como hacer que después de que se ingreso de forma correcta el usuario y contraseña se pueda abrir otra ventana para ingresar a un programa. Gracias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey