Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: DeMoNcRaZy en 20 Enero 2022, 22:34 pm



Título: Problema con Clases y Funciones POO (Python)
Publicado por: DeMoNcRaZy en 20 Enero 2022, 22:34 pm
Hola, buenas a tod@s

Estoy intentando hacer un login verificando el usuario y password. Si lo hago normal sin POO me funciona y lo hago bien. La cosa es que estoy metiéndome en POO y quiero hacerlo en POO pero lo de vincular clases y funciones mas o menos lo llevo. Pero tengo aquí un fallo con que no lee el cursor, y lo tengo definido

Tengo el archivo principal:

Código
  1. from tkinter import *
  2. from tkinter import ttk
  3. import pymysql
  4. from tkinter import messagebox as MessageBox
  5. from tkinter import scrolledtext as st
  6. import conexion
  7.  
  8. class Aplicacion:
  9. def __init__(self):
  10. self.conexion1 = conexion.conexiones()
  11. self.ventana1 = Tk()
  12. self.ventana1.title("Login")
  13. self.ventana1.geometry("400x400")
  14. self.imagenLogo = PhotoImage(file="logo2.png")
  15. self.divLogo = Label(self.ventana1, image=self.imagenLogo)
  16. self.divLogo.place(x=93, y=0)
  17. self.x_ventana = self.ventana1.winfo_screenwidth() // 2 - 300 // 2
  18. self.y_ventana = self.ventana1.winfo_screenheight() // 2 - 300 // 2
  19. self.posicion = str(300) + "x" + str(300) + "+" + str(self.x_ventana) + "+" + str(self.y_ventana)
  20. self.ventana1.geometry(self.posicion)
  21. self.ventana1.resizable(0,0)
  22.  
  23. self.formulario()
  24.  
  25.  
  26.  
  27. self.ventana1.mainloop()
  28.  
  29. def formulario(self):
  30. ttk.Label(text="Usuario:").place(x=50, y=110)
  31. ttk.Label(text="Contraseña:").place(x=50, y=165)
  32.  
  33. self.formUsuarioString = StringVar()
  34. self.formUsuario = Entry(self.ventana1, textvariable=self.formUsuarioString)
  35. self.formUsuario.place(x=50, y=130, width=200, height=30)
  36.  
  37. self.formPasswordString = StringVar()
  38. self.formPassword = Entry(self.ventana1, textvariable=self.formPasswordString)
  39. self.formPassword.place(x=50, y=185, width=200, height=30)
  40.  
  41. botonAcceder = Button(self.ventana1, text="Acceder", command=self.login)
  42. botonAcceder.place(x=75, y=240, width=150, height=30)
  43.  
  44. def login(self):
  45. datos = (self.formUsuarioString.get(), self.formPasswordString.get())
  46.  
  47. self.conexion1.verificar(datos)
  48.  
  49.  
  50.  
  51.  
  52.  
  53. Ventana = Aplicacion()

y luego en el archivo conexión.py tengo eso:

Código
  1. import pymysql
  2.  
  3. class conexiones:
  4. def conexion(self):
  5. conexion2 = pymysql.connect(host='null',
  6.                                 user='myadmin',
  7.                                 password='null',
  8.                                 database='python',
  9.                                 charset='utf8mb4',
  10.                                 cursorclass=pymysql.cursors.DictCursor)
  11.  
  12. def verificar(self, datos):
  13. con1 = self.conexion()
  14. cur = con1.cursor()
  15. sql = "SELECT * FROM trabajador WHERE nombre='{}' AND password='{}'".format(self.formUsuarioString.get(), self.formPasswordString.get())
  16. cur.execute(sql)
  17. comprobardatosAcceso=cur.fetchall()

y este es el error que me da cuando intento hacer la consulta:

Código:
Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/__init__.py", line 1921, in __call__
    return self.func(*args)
  File "/Users/tomas/Downloads/DonMovil/objetos.py", line 47, in login
    self.conexion1.verificar(datos)
  File "/Users/tomas/Downloads/DonMovil/conexion.py", line 14, in verificar
    cur = con1.cursor()
AttributeError: 'NoneType' object has no attribute 'cursor'
[Finished in 12.2s]

¿Donde puede estar el error?

Cualquier información adicional lo agradecería.

Saludos!


Título: Re: Problema con Clases y Funciones POO (Python)
Publicado por: Panic0 en 22 Enero 2022, 21:22 pm
Hola, buenas a tod@s

Estoy intentando hacer un login verificando el usuario y password. Si lo hago normal sin POO me funciona y lo hago bien. La cosa es que estoy metiéndome en POO y quiero hacerlo en POO pero lo de vincular clases y funciones mas o menos lo llevo. Pero tengo aquí un fallo con que no lee el cursor, y lo tengo definido

Tengo el archivo principal:

Código
  1. from tkinter import *
  2. from tkinter import ttk
  3. import pymysql
  4. from tkinter import messagebox as MessageBox
  5. from tkinter import scrolledtext as st
  6. import conexion
  7.  
  8. class Aplicacion:
  9. def __init__(self):
  10. self.conexion1 = conexion.conexiones()
  11. self.ventana1 = Tk()
  12. self.ventana1.title("Login")
  13. self.ventana1.geometry("400x400")
  14. self.imagenLogo = PhotoImage(file="logo2.png")
  15. self.divLogo = Label(self.ventana1, image=self.imagenLogo)
  16. self.divLogo.place(x=93, y=0)
  17. self.x_ventana = self.ventana1.winfo_screenwidth() // 2 - 300 // 2
  18. self.y_ventana = self.ventana1.winfo_screenheight() // 2 - 300 // 2
  19. self.posicion = str(300) + "x" + str(300) + "+" + str(self.x_ventana) + "+" + str(self.y_ventana)
  20. self.ventana1.geometry(self.posicion)
  21. self.ventana1.resizable(0,0)
  22.  
  23. self.formulario()
  24.  
  25.  
  26.  
  27. self.ventana1.mainloop()
  28.  
  29. def formulario(self):
  30. ttk.Label(text="Usuario:").place(x=50, y=110)
  31. ttk.Label(text="Contraseña:").place(x=50, y=165)
  32.  
  33. self.formUsuarioString = StringVar()
  34. self.formUsuario = Entry(self.ventana1, textvariable=self.formUsuarioString)
  35. self.formUsuario.place(x=50, y=130, width=200, height=30)
  36.  
  37. self.formPasswordString = StringVar()
  38. self.formPassword = Entry(self.ventana1, textvariable=self.formPasswordString)
  39. self.formPassword.place(x=50, y=185, width=200, height=30)
  40.  
  41. botonAcceder = Button(self.ventana1, text="Acceder", command=self.login)
  42. botonAcceder.place(x=75, y=240, width=150, height=30)
  43.  
  44. def login(self):
  45. datos = (self.formUsuarioString.get(), self.formPasswordString.get())
  46.  
  47. self.conexion1.verificar(datos)
  48.  
  49.  
  50.  
  51.  
  52.  
  53. Ventana = Aplicacion()

y luego en el archivo conexión.py tengo eso:

Código
  1. import pymysql
  2.  
  3. class conexiones:
  4. def conexion(self):
  5. conexion2 = pymysql.connect(host='null',
  6.                                 user='myadmin',
  7.                                 password='null',
  8.                                 database='python',
  9.                                 charset='utf8mb4',
  10.                                 cursorclass=pymysql.cursors.DictCursor)
  11.  
  12. def verificar(self, datos):
  13. con1 = self.conexion()
  14. cur = con1.cursor()
  15. sql = "SELECT * FROM trabajador WHERE nombre='{}' AND password='{}'".format(self.formUsuarioString.get(), self.formPasswordString.get())
  16. cur.execute(sql)
  17. comprobardatosAcceso=cur.fetchall()

y este es el error que me da cuando intento hacer la consulta:

Código:
Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/__init__.py", line 1921, in __call__
    return self.func(*args)
  File "/Users/tomas/Downloads/DonMovil/objetos.py", line 47, in login
    self.conexion1.verificar(datos)
  File "/Users/tomas/Downloads/DonMovil/conexion.py", line 14, in verificar
    cur = con1.cursor()
AttributeError: 'NoneType' object has no attribute 'cursor'
[Finished in 12.2s]

¿Donde puede estar el error?

Cualquier información adicional lo agradecería.

Saludos!


El valor no está llegando a con1

Podes probar dos cosas:
1) globalizar con1


2) ponerle self a con1


Título: Re: Problema con Clases y Funciones POO (Python)
Publicado por: DeMoNcRaZy en 23 Enero 2022, 14:05 pm

El valor no está llegando a con1

Podes probar dos cosas:
1) globalizar con1


2) ponerle self a con1

Gracias por su comentario.

Al final no era nada de eso.

Solo había que hacer un return a la función conexión.

Código
  1. return conexion2

Con eso se ha solucionado el problema.

Gracias.