Mensajes: 108
Temas: 27
Registro en: Feb 2019
Reputación:
0
Buenas:
Como dice el título estoy teniendo problemas a la hora de crear una pequeña aplicación de login basada en base de datos.
En principio todo funciona correctamente siempre y cuando indiques la contraseña correcta, pero si te equivocas y tratas de rectificar el resultado es que siempre aparece el mensaje de contraseña no válida como si fuera un bucle a pesar de que la contraseña que estás introduciendo de nuevo corrigiendo la anterior sí es correcta. (No sé si me explico bien). ¿Puede que necesite hacer una "reconexión a la base de datos en la sentecia elif?.
Como una imagen vale mil palabras os pongo el código que estoy usando. Esta es la función que se conecta a la base de datos y comprueba que la contraseña es correcta).
Código: def abrisapp():
# PARAMETERS CONNECTION
psql_HOST = "127.0.0.1"
psql_PORT = "5432"
psql_USER = "postgres"
psql_PASS = "2208"
psql_DB = "cronas"
usur = self.comusu.get()
valid = self.enusu.get()
CAT = self.comusu.get()
query = "SELECT passwor FROM claves WHERE usuario="+"'" + usur + "'" + ";"
try:
connstr = "host=%s port=%s user=%s password=%s dbname=%s" % (psql_HOST, psql_PORT, psql_USER, psql_PASS, psql_DB)
conn = psycopg2.connect(connstr)
cur = conn.cursor()
cur.execute(query)
row = cur.fetchall()
conn.commit()
cur.close()
conn.close()
def printpasswor():
self.usuval.insert(0, row)
if self.usuval.get() == valid:
#CAT = self.comusu.get()
self.prinapp = Tk()
self.prinapp.title("CENTRO DE CONTROL DE DATOS")
self.prinapp.geometry('1680x1050')
self.prinapp.resizable(False, False)
self.prinapp.protocol("WM_DELETE_WINDOW", nocerrprinapp)
# FRAMES PRINAPP
self.frameprinapp1 = ttk.Frame(self.prinapp, style="Frames.TFrame")
self.frameprinapp1.grid(row=0, column=0)
self.frameprinapp2 = ttk.Frame(self.prinapp, style="Frames.TFrame")
self.frameprinapp2.grid(row=1, column=0)
# LABELS PRINAPP
self.labprinappcat = ttk.Label(self.frameprinapp1, text='C.A.T', font=('Gentium', 12, 'bold'), relief='groove', borderwidth=5, background='light green')
self.labprinappcat.grid(row=0, column=0, pady=3)
self.labprinappCAT = ttk.Label(self.frameprinapp1, text=CAT, font=('Gentium', 20, 'bold'), relief='sunken', background='#EAFF92', borderwidth=2, foreground='dark blue')
self.labprinappCAT.grid(row=1, column=0, padx=5)
# MENU PRINAPP
self.menubar = Menu(self.prinapp, tearoff = False, font=('Gentium', 10, 'bold'), relief='ridge', activebackground='light green')
self.menuprinapp = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp1 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp2 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp3 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci1 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci2 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp.add_cascade(label='Centro Control Logístico', menu=self.menuabci)
self.menuprinapp.add_cascade(label='Centro Control Geográfico', menu=self.menuabci1)
self.menuprinapp1.add_command(label='Ir a ...')
self.menuabci.add_command(label= 'Abrir', command=abreCCL, state='disabled')
self.menuabci.add_command(label= 'Cerrar', command=cierraCCL)
self.menuabci1.add_command(label= 'Abrir')
self.menuabci1.add_command(label= 'Cerrar')
self.menuprinapp.add_separator()
self.menuprinapp.add_command(label= "Salir de Aplicación", command=quitapp)
self.menubar.add_cascade(label = "Centros de Control", menu=self.menuprinapp)
self.menubar.add_cascade(label = "Circulares", menu=self.menuprinapp1)
self.menubar.add_cascade(label = "Procedimientos", menu=self.menuprinapp2)
self.menubar.add_cascade(label = "Manual", menu=self.menuprinapp3)
self.prinlog.destroy()
self.prinapp.configure(menu=self.menubar)
openCCL(self)
elif self.usuval.get() != valid:
messagebox.showinfo(message='La contraseña no es válida', title='ADVERTENCIA')
printpasswor()
except:
print("Error en la conexión a la base de datos")
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
07-09-2019, 01:59 AM
(Última modificación: 07-09-2019, 01:59 AM por Francisco.)
Hola. Es un poco complicado determinarlo porque no tiene indentación el código. No obstante, parece que en esta línea:
Código: self.usuval.insert(0, row)
estás insertando la contraseña que obtenés de la base de datos en la misma caja de texto donde se supone el usuario debe escribir su contraseña, lo cual suena un poco extraño. Por otro lado, ¿de dónde viene la variable valid con la que hacés la comparación?
Mensajes: 108
Temas: 27
Registro en: Feb 2019
Reputación:
0
07-09-2019, 08:14 AM
(Última modificación: 07-09-2019, 08:36 AM por Myszowor.)
Anda leches si falta la mitad del código. A ver lo pongo entero otra vez:
Código: class App112:
def __init__(self):
self.prinlog = Tk()
self.prinlog.title("BIENVENID@S A ...")
self.prinlog.geometry('800x600+500+200')
self.prinlog.resizable(False, False)
# ENTRY PRINAPP
self.usuval = ttk.Entry(self.prinlog)
#self.usuval.grid(row=0, column=0)
def quitapp():
try:
self.prinapp.destroy()
self.rootccl.destroy()
except TclError:
pass
def abreCCL():
self.menuabci.entryconfigure("Abrir", state='disabled')
self.menuabci.entryconfigure("Cerrar", state='normal')
openCCL(self)
def cierraCCL():
try:
self.rootccl.destroy()
self.menuabci.entryconfigure("Abrir", state='normal')
self.menuabci.entryconfigure("Cerrar", state='disabled')
except TclError:
pass
except AttributeError:
pass
# FUNTIONS LOGIN
def salirlog():
self.prinlog.destroy()
def nocerrprinlog():
pass
def abrisapp():
def nocerrprinapp():
pass
# PARAMETERS CONNECTION
psql_HOST = "127.0.0.1"
psql_PORT = "5432"
psql_USER = "postgres"
psql_PASS = "2208"
psql_DB = "cronas"
usur = self.comusu.get()
valid = self.enusu.get()
CAT = self.comusu.get()
query = "SELECT passwor FROM claves WHERE usuario="+"'" + usur + "'" + ";"
try:
connstr = "host=%s port=%s user=%s password=%s dbname=%s" % (psql_HOST, psql_PORT, psql_USER, psql_PASS, psql_DB)
conn = psycopg2.connect(connstr)
cur = conn.cursor()
cur.execute(query)
row = cur.fetchall()
conn.commit()
cur.close()
conn.close()
def printpasswor():
self.usuval.insert(0, row)
if self.usuval.get() == valid:
#CAT = self.comusu.get()
self.prinapp = Tk()
self.prinapp.title("CENTRO DE CONTROL DE DATOS")
self.prinapp.geometry('1680x1050')
self.prinapp.resizable(False, False)
self.prinapp.protocol("WM_DELETE_WINDOW", nocerrprinapp)
# FRAMES PRINAPP
self.frameprinapp1 = ttk.Frame(self.prinapp, style="Frames.TFrame")
self.frameprinapp1.grid(row=0, column=0)
self.frameprinapp2 = ttk.Frame(self.prinapp, style="Frames.TFrame")
self.frameprinapp2.grid(row=1, column=0)
# LABELS PRINAPP
self.labprinappcat = ttk.Label(self.frameprinapp1, text='C.A.T', font=('Gentium', 12, 'bold'), relief='groove', borderwidth=5, background='light green')
self.labprinappcat.grid(row=0, column=0, pady=3)
self.labprinappCAT = ttk.Label(self.frameprinapp1, text=CAT, font=('Gentium', 20, 'bold'), relief='sunken', background='#EAFF92', borderwidth=2, foreground='dark blue')
self.labprinappCAT.grid(row=1, column=0, padx=5)
# MENU PRINAPP
self.menubar = Menu(self.prinapp, tearoff = False, font=('Gentium', 10, 'bold'), relief='ridge', activebackground='light green')
self.menuprinapp = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp1 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp2 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp3 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci1 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci2 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp.add_cascade(label='Centro Control Logístico', menu=self.menuabci)
self.menuprinapp.add_cascade(label='Centro Control Geográfico', menu=self.menuabci1)
self.menuprinapp1.add_command(label='Ir a ...')
self.menuabci.add_command(label= 'Abrir', command=abreCCL, state='disabled')
self.menuabci.add_command(label= 'Cerrar', command=cierraCCL)
self.menuabci1.add_command(label= 'Abrir')
self.menuabci1.add_command(label= 'Cerrar')
self.menuprinapp.add_separator()
self.menuprinapp.add_command(label= "Salir de Aplicación", command=quitapp)
self.menubar.add_cascade(label = "Centros de Control", menu=self.menuprinapp)
self.menubar.add_cascade(label = "Circulares", menu=self.menuprinapp1)
self.menubar.add_cascade(label = "Procedimientos", menu=self.menuprinapp2)
self.menubar.add_cascade(label = "Manual", menu=self.menuprinapp3)
self.prinlog.destroy()
self.prinapp.configure(menu=self.menubar)
openCCL(self)
elif self.usuval.get() != valid:
messagebox.showinfo(message='La contraseña no es válida', title='ADVERTENCIA')
printpasswor()
except:
print("Error en la conexión a la base de datos")
# STYLES
# STYLE BUTTONS
self.stylebutacep = ttk.Style()
self.stylebutacep.configure("Butacep.TButton", relief = 'raised', borderwidth = 5, background ='dark green', foreground='white', font=('Ubuntu', 12, 'bold'))
self.stylebutcance = ttk.Style()
self.stylebutcance.configure("Butcance.TButton", relief = 'raised', borderwidth = 5, background ='red4', foreground='white', font=('Ubuntu', 12, 'bold'))
# STYLE COMBOBOX
self.bigfont = tkfont.Font(family="Ubuntu",size=14)
self.prinlog.option_add("*TCombobox*Listbox*Font", self.bigfont)
# STYLE CHECKBUTTONS
self.styleradio = ttk.Style()
self.styleradio.configure("Butrad.TCheckbutton", font=("Ubuntu", 12, 'bold'), relief='raised', borderwidth=2, foreground='dark blue')
# STYLE FRAMES
self.styleframe = ttk.Style()
self.styleframe.configure("Frames.TFrame", relief='ridge', borderwidth=5)
# LISTS LOGIN
self.usurlist = ["CJFP", "CEPC", "CMMR", "CMJD", "CBLD"]
# LOGIN FRAME
self.frameprinlog = ttk.Frame(self.prinlog, width=800, height=600)
self.frameprinlog.grid(row=0, column=0)
self.canvas1 = Canvas(self.frameprinlog, width=800, height=600, background='black')
self.canvas1.grid(row=0, column=0, sticky=N+S+E+W)
self.peregrino = PhotoImage(file="/home/juan/Downloads/Peregrino.gif")
self.canvas1.create_image(400,300, image=self.peregrino, anchor='center')
self.framelogin_can= ttk.Frame(self.canvas1, style="Frames.TFrame")
self.canvas1.create_window(0,0, window=self.framelogin_can, anchor='nw')
self.comusu = ttk.Combobox(self.framelogin_can, width=5, font=('Ubuntu', 14))
self.comusu.grid(row=2, column=0, pady=5)
self.comusu["values"]= self.usurlist
self.eti1usu = ttk.Label(self.framelogin_can, text='USUARIO', background='light green', relief='ridge', borderwidth=2, font=('Gentium',14, 'bold'))
self.eti1usu.grid(row=1, column=0, pady=5)
self.eti2usu = ttk.Label(self.framelogin_can, text='CONTRASEÑA', background='light green', relief='ridge', borderwidth=2, font=('Gentium',14, 'bold'))
self.eti2usu.grid(row=3, column=0, pady=5, padx=5)
self.enusu = ttk.Entry(self.framelogin_can, width=10, font=('Ubuntu', 14, 'bold'), show='*')
self.enusu.grid(row=4, column=0, pady=5)
self.butusu = ttk.Button(self.framelogin_can, text='ACEPTAR', style ="Butacep.TButton", command=abrisapp)
self.butusu.grid(row=9, column=0, pady=5)
self.but1usu = ttk.Button(self.framelogin_can, text='CANCELAR', style = "Butcance.TButton", command=salirlog)
self.but1usu.grid(row=10, column=0, pady=5)
self.etiusu = ttk.Label(self.framelogin_can, text='LOGIN', font=('Ubuntu', 26, 'bold'), background='light blue', relief='ridge', borderwidth=5)
self.etiusu.grid(row=0, column=0, padx=10, pady=10)
self.prinlog.protocol("WM_DELETE_WINDOW", nocerrprinlog)
self.prinlog.mainloop()
def main():
my_app = App112()
if __name__ == '__main__':
main()
Vale, tengo un entry "virtual" (self.usuval) es decir está en la aplicación pero no está representado gráficamente porque no tiene .grid().
Hago esto porque por alguna razón que no entiendo, cuando intento obtener el campo de la contraseña de la base de datos me da error. Lo que hago es que dentro de ese entry "virtual", introduzco la contraseña obtenida del SELECT de la base de datos y desde ahí ya no me da ningún error y parece que detecta la contraseña correctamente. (Puede que sea toda esa vuelta la que me esté dando problemas, creo que tengo la solución pero aún no he podido probarlo. Sería el usar el comando cur.fetchone() en vez de el cur.fetchall() ya que este último me crea una lista y puede que sea eso lo que me esté dando el problema).
Bien, como digo todo funciona perfectamente si desde el principio introduces la contraseña correcta la app se abre sin problemas y todo funciona perfectamente. Si por alguna razón introduces la contraseña incorrecta también funciona correctamente y aparece el mensaje 'la contraseña no es válida'. Y aquí comienza el problema:
Si borras la contraseña incorrecta e intentas poner otra, por mucho que introduzcas la contraseña correcta siempre vuelve a aparecer el mensaje" 'la contraseña no es válida'. Es decir es como si ya no detectase el SELECT de la base de datos que introduje en el entry virtual.
Esto es por el problema de que el usuario pueda equivocarse al introducir la contraseña y quiero solucionarlo para que si la borre e introduzca la correcta le de acceso a la app.
Siento lo de la identación pero en teoría la misma es correcta ya que no me arroja ningún error.
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
07-09-2019, 07:23 PM
(Última modificación: 07-09-2019, 07:24 PM por Francisco.)
Efectivamente todo ese rodeo te está dando problemas. Simplemente guarda la contraseña de la base de datos así:
Código: password = cursor.fetchone()[0]
Y luego compara el texto ingresado por el usuario con esa variable.
Mensajes: 108
Temas: 27
Registro en: Feb 2019
Reputación:
0
(07-09-2019, 07:23 PM)Francisco escribió: Efectivamente todo ese rodeo te está dando problemas. Simplemente guarda la contraseña de la base de datos así:
Código: password = cursor.fetchone()[0]
Y luego compara el texto ingresado por el usuario con esa variable.
Confirmado el problema era el entry "virtual" y el fetchall().
Ya funciona todo correctamente. (No lo he hecho exactamente como tú pero el resultado es óptimo).
Pongo aquí el ejemplo de como funciona todo correctamente por si alguien tiene el mismo problema. (Suponiendo que use postgresql y la identación correspondiente).
Código: # PARAMETERS CONNECTION
psql_HOST = "127.0.0.1"
psql_PORT = "5432"
psql_USER = "postgres"
psql_PASS = "2208"
psql_DB = "cronas"
usur = self.comusu.get()
passw = self.enusu.get()
CAT = self.comusu.get()
query = "SELECT passwor FROM claves WHERE usuario="+"'" + usur + "'" + ";"
try:
connstr = "host=%s port=%s user=%s password=%s dbname=%s" % (psql_HOST, psql_PORT, psql_USER, psql_PASS, psql_DB)
conn = psycopg2.connect(connstr)
cur = conn.cursor()
cur.execute(query)
row = cur.fetchone()[0]
conn.commit()
cur.close()
conn.close()
def printpasswor():
if row == passw:
self.prinapp = Tk()
self.prinapp.title("CENTRO DE CONTROL DE DATOS")
self.prinapp.geometry('1680x1050')
self.prinapp.resizable(False, False)
self.prinapp.protocol("WM_DELETE_WINDOW", nocerrprinapp)
# FRAMES PRINAPP
self.frameprinapp1 = ttk.Frame(self.prinapp, style="Frames.TFrame")
self.frameprinapp1.grid(row=0, column=0)
self.frameprinapp2 = ttk.Frame(self.prinapp, style="Frames.TFrame")
self.frameprinapp2.grid(row=1, column=0)
# LABELS PRINAPP
self.labprinappcat = ttk.Label(self.frameprinapp1, text='C.A.T', font=('Gentium', 12, 'bold'), relief='groove', borderwidth=5, background='light green')
self.labprinappcat.grid(row=0, column=0, pady=3)
self.labprinappCAT = ttk.Label(self.frameprinapp1, text=CAT, font=('Gentium', 20, 'bold'), relief='sunken', background='#EAFF92', borderwidth=2, foreground='dark blue')
self.labprinappCAT.grid(row=1, column=0, padx=5)
# MENU PRINAPP
self.menubar = Menu(self.prinapp, tearoff = False, font=('Gentium', 10, 'bold'), relief='ridge', activebackground='light green')
self.menuprinapp = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp1 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp2 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp3 = Menu(self.menubar, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci1 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuabci2 = Menu(self.menuprinapp, tearoff = False, font=('Gentium', 10, 'bold'), activebackground='light green')
self.menuprinapp.add_cascade(label='Centro Control Logístico', menu=self.menuabci)
self.menuprinapp.add_cascade(label='Centro Control Geográfico', menu=self.menuabci1)
self.menuprinapp1.add_command(label='Ir a ...')
self.menuabci.add_command(label= 'Abrir', command=abreCCL, state='disabled')
self.menuabci.add_command(label= 'Cerrar', command=cierraCCL)
self.menuabci1.add_command(label= 'Abrir')
self.menuabci1.add_command(label= 'Cerrar')
self.menuprinapp.add_separator()
self.menuprinapp.add_command(label= "Salir de Aplicación", command=quitapp)
self.menubar.add_cascade(label = "Centros de Control", menu=self.menuprinapp)
self.menubar.add_cascade(label = "Circulares", menu=self.menuprinapp1)
self.menubar.add_cascade(label = "Procedimientos", menu=self.menuprinapp2)
self.menubar.add_cascade(label = "Manual", menu=self.menuprinapp3)
self.prinlog.destroy()
self.prinapp.configure(menu=self.menubar)
openCCL(self)
else:
messagebox.showinfo(message='La contraseña no es válida', title='ADVERTENCIA')
printpasswor()
except:
print("Error en la conexión a la base de datos")
MUCHAS GRACIAS
|