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 |
Ingreso correcto |
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!!!
-
-
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
-
-
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
-
Gracias Randall por el comentario y por visitar el blog. Comentarios como el tuyo son los que motivan a seguir escribiendo. Saludos
-
-
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
-
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
-
-
Muito Obrigado, me ajudou muito... Gracias !!!!!!!!!!!!
-
Excelente Felipe, gracias por comentar y pasarte por el blog. Saludos
-
-
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-
Thanks for visiting the blog
-
-
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.closewhile usuario!= "":
i=0
while i<c:
CU=dic[i]['codU']
if usuario == CU:
print "asd"
Button (text = "Entrar", command=login).pack()
ventana.mainloop() -
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?
-
Trata con esto:
from tkinter import messagebox
Y los mensajes los generas de esta manera:
messagebox.showinfo(mesage="tumensaje", title="titulo de tu ventana")
-
-
Este comentario ha sido eliminado por el autor.
-
Excelente, muchas gracias. Anduve buscando por un buen rato y este ejemplo me funciono muy bien.
-
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
-
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.
-
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
-
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
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,