|
1
|
Programación / Scripting / Error al cerrar ventana principal tkinter con destroy()
|
en: 6 Agosto 2023, 02:14 am
|
Buenas, tengo un problema estoy intentado cerrar la ventana principal al hacel login, con destroy(), pero me lanza error ¿por qué? que estoy haciendo mal? como podria solucionarlo, cualquier informacion adicional lo agradeceria. el error que me lanza cuando presiono el boton y quiero cerrar la ventana es el siguiente: Exception in Tkinter callback Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/tkinter/__init__.py", line 1948, in __call__ return self.func(*args) ^^^^^^^^^^^^^^^^ File "/Users/tomassanchezgarcia/Desktop/python-test/iniciar_sesion.py", line 84, in validar self.root.destroy() ^^^^^^^^^ AttributeError: 'Login' object has no attribute 'root'
main.py from tkinter import * from tkinter import ttk import tkinter as tk import pymysql from conexion import * from tkinter import messagebox from PIL import Image, ImageTk from iniciar_sesion import Login class AplicacionInventario: def __init__(self): self.root = Tk() self.root.title("StockMaster") self.root.geometry("400x500") #Bloquear agrandar ventana self.root.resizable(0,0) self.wtotal = self.root.winfo_screenwidth() self.htotal = self.root.winfo_screenheight() # Guardamos el largo y alto de la ventana self.wventana = 400 self.hventana = 500 # # Aplicamos la siguiente formula para calcular donde debería posicionarse self.pwidth = round(self.wtotal/2-self.wventana/2) self.pheight = round(self.htotal/2-self.hventana/2) # Se lo aplicamos a la geometría de la ventana self.root.geometry(str(self.wventana)+"x"+str(self.hventana)+"+"+str(self.pwidth)+"+"+str(self.pheight)) self.imagen = Image.open("src/logo.png") self.imagen = self.imagen.resize((350, 100)) # Opcional: Redimensionar la imagen self.imagen = ImageTk.PhotoImage(self.imagen) # Crear un widget Label con la imagen y colocarlo en la ventana self.label_imagen = tk.Label(self.root, image=self.imagen) self.label_imagen.pack(pady=20) self.login1 = Login(self) #fetch_data_button = tk.Button(self.root, text="Obtener Datos", command=self.mostrar2) #fetch_data_button.pack() self.root.mainloop() AplicacionInventario()
iniciar_sesion.py from tkinter import * from tkinter import ttk import tkinter as tk import pymysql from conexion import * from tkinter import messagebox from PIL import Image, ImageTk from test2 import Menus class Login: def __init__(self, app): self.app = app self.t_Email = "Email:" self.label_email = tk.Label(text=self.t_Email) self.label_email.pack(pady=5, padx=20) self.label_email.place(x=150, y=150, width=100, height=20) self.entry_email = tk.Entry() self.entry_email.pack(pady=5) self.entry_email.place(x=75, y=170, width=250, height=50) self.t_Password = "Contraseña:" self.label_password = tk.Label(text=self.t_Password) self.label_password.pack(pady=5, padx=20) self.label_password.place(x=150, y=220, width=100, height=20) self.entry_password = tk.Entry(show="*") self.entry_password.pack(pady=5) self.entry_password.place(x=75, y=240, width=250, height=50) self.login_email = self.entry_email.get() self.login_password = self.entry_password.get() self.boton_login = tk.Button(text="Iniciar Sesión", command=self.validar) self.boton_login.pack(pady=5) self.boton_login.place(x=125, y=300, width=150, height=50) def validar(self): #self.conexion_login = connect_to_database() #self.cursor_conexion_login = self.conexion_login.cursor() #self.cursor_conexion_login.execute("SELECT email, password FROM usuarios WHERE email=%s AND password=%s", (self.login_email, self.login_password)) #self.verificar_login = self.cursor_conexion_login.fetchall() #messagebox.showwarning("Advertencia", self.verificar_login) # Conectarse a la base de datos utilizando la función importada self.connection2 = connect_to_database() self.cursor2 = self.connection2.cursor() # Ejemplo: Ejecutar una consulta para obtener datos self.cursor2.execute("SELECT nombre,password FROM usuarios") self.data2 = self.cursor2.fetchall() #messagebox.showwarning("Advertencia", self.data2) # Cerrar el cursor y la conexión for self.fila in self.data2: self.v_email = self.fila[0] self.v_password = self.fila[1] self.cursor2.close() self.connection2.close() if self.entry_email.get() == "" or self.entry_password.get() == "": self.dialogo = tk.Toplevel() self.dialogo.title("Diálogo Personalizado") self.dialogo.geometry("300x50") self.dialogo.resizable(0,0) self.wtotal2 = self.dialogo.winfo_screenwidth() self.htotal2 = self.dialogo.winfo_screenheight() self.wventana2 = 300 self.hventana2 = 50 self.pwidth2 = round(self.wtotal2/2-self.wventana2/2) self.pheight2 = round(self.htotal2/2-self.hventana2/2) self.dialogo.geometry(str(self.wventana2)+"x"+str(self.hventana2)+"+"+str(self.pwidth2)+"+"+str(self.pheight2)) self.etiqueta = tk.Label(self.dialogo, text="Este es un cuadro de diálogo personalizado.", padx=10, pady=10) self.etiqueta.pack() elif self.entry_email.get() == self.v_email and self.entry_password.get() == self.v_password: #messagebox.showwarning("Advertencia", "PERFECTO COINCIDE") self.ventana_menu = Menus(self) else: self.root.destroy() messagebox.showwarning("Advertencia", "Los datos introducidos son incorrectos.")
|
|
|
2
|
Programación / Scripting / Sumar valores de una columna - treeview
|
en: 19 Noviembre 2022, 18:03 pm
|
Buenas, Estoy realizando un sistema de venta en el cual introduces un código de articulo en el que viene su nombre y precio, ej: Peras 1,99€ He echo un Treeview, y de momento todo bien me muestra los datos todo bien, pero ahora llega el momento de tener que sumar los valores de la columna precio para saber el total del inventario y no consigo hacerlo que se sume, obtengo el precio de dicho precio y me lo muestra pero no me suma el precio nuevo introducido con el anterior introducido, en plan: ingreso peras 2€, ingreso manzana 3€, pues obtengo el precio individual, y yo lo que quiero obtener es el total que sería 5€. Si me pudiesen orientar o cualquier información adiciona lo agradecería. Con esto introduzco los datos a treeview desde la base de datos: for self.x2 in self.r_codigo: print (self.x2["nombre"], self.x2["talla"], self.x2["precio"]+"€") self.tree.insert('', 'end', text=self.x2["nombre"], values=(self.x2["talla"],self.x2["precio"])) print(self.x2["fecha"]) for self.item in self.tree.get_children(): self.total = 0 self.celda = int(self.tree.set(self.item,"col2")) self.total += self.celda print(self.total)
y este es el treeview: self.tree = ttk.Treeview(self.pagina1,columns=("col1","col2"), height=50) self.tree.grid(column=0, row=2, padx=50, pady=100) ### COLUMNAS ### self.tree.column("#0",width=250) self.tree.column("col1",width=150, anchor=CENTER) self.tree.column("col2",width=150, anchor=CENTER) ### NOMBRES COLUMNAS ### self.tree.heading("#0", text="Articulo", anchor=CENTER) self.tree.heading("col1", text="Talla", anchor=CENTER) self.tree.heading("col2", text="Precio", anchor=CENTER)
Todo me funciona correctamente, lo único es que no consigo hacer el total de los precios introducidos en la columna precios. Saludos!
|
|
|
3
|
Programación / Scripting / Re: Problema con Clases y Funciones POO (Python)
|
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. return conexion2
Con eso se ha solucionado el problema. Gracias.
|
|
|
4
|
Programación / Scripting / Problema con Clases y Funciones POO (Python)
|
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: from tkinter import * from tkinter import ttk import pymysql from tkinter import messagebox as MessageBox from tkinter import scrolledtext as st import conexion class Aplicacion: def __init__(self): self.conexion1 = conexion.conexiones() self.ventana1 = Tk() self.ventana1.title("Login") self.ventana1.geometry("400x400") self.imagenLogo = PhotoImage(file="logo2.png") self.divLogo = Label(self.ventana1, image=self.imagenLogo) self.divLogo.place(x=93, y=0) self.x_ventana = self.ventana1.winfo_screenwidth() // 2 - 300 // 2 self.y_ventana = self.ventana1.winfo_screenheight() // 2 - 300 // 2 self.posicion = str(300) + "x" + str(300) + "+" + str(self.x_ventana) + "+" + str(self.y_ventana) self.ventana1.geometry(self.posicion) self.ventana1.resizable(0,0) self.formulario() self.ventana1.mainloop() def formulario(self): ttk.Label(text="Usuario:").place(x=50, y=110) ttk.Label(text="Contraseña:").place(x=50, y=165) self.formUsuarioString = StringVar() self.formUsuario = Entry(self.ventana1, textvariable=self.formUsuarioString) self.formUsuario.place(x=50, y=130, width=200, height=30) self.formPasswordString = StringVar() self.formPassword = Entry(self.ventana1, textvariable=self.formPasswordString) self.formPassword.place(x=50, y=185, width=200, height=30) botonAcceder = Button(self.ventana1, text="Acceder", command=self.login) botonAcceder.place(x=75, y=240, width=150, height=30) def login(self): datos = (self.formUsuarioString.get(), self.formPasswordString.get()) self.conexion1.verificar(datos) Ventana = Aplicacion()
y luego en el archivo conexión.py tengo eso: import pymysql class conexiones: def conexion(self): conexion2 = pymysql.connect(host='null', user='myadmin', password='null', database='python', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) def verificar(self, datos): con1 = self.conexion() cur = con1.cursor() sql = "SELECT * FROM trabajador WHERE nombre='{}' AND password='{}'".format(self.formUsuarioString.get(), self.formPasswordString.get()) cur.execute(sql) comprobardatosAcceso=cur.fetchall()
y este es el error que me da cuando intento hacer la consulta: 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!
|
|
|
5
|
Programación / Scripting / Re: Problema con ttk.Label en POO (python)
|
en: 20 Enero 2022, 22:29 pm
|
Hola buenas tardes, el error que obtienes es por una mala indentacion de una línea de tu código, justamente en la línea que da error, para solucionarlo debes reemplazar esta línea: self.label1 = ttk.Label(text="Usuario:").place(x=50, y=110)
Por ésta: self.label1 = ttk.Label(text="Usuario:").place(x=50, y=110)
Simplemente antes de la instrucción de la línea que acabo de dejar, debes dejar 4 espacios o una tabulación. Prueba esa modificación y nos comentas. Saludos Sí, asi es correcto. Ya todo funciona bien. No sabia que una cosa así de tonta me diera tanto quebradero de cabeza vaya. Muchas gracias y disculpa las molestias ocasionada por esta tontería. Saludos.
|
|
|
6
|
Programación / Scripting / Problema con ttk.Label en POO (python)
|
en: 20 Enero 2022, 19:49 pm
|
Hola, buenas a tod@s Estoy haciendo código POO y tengo algún problema, he buscado en internet y supuestamente lo estoy haciendo bien. Pero me da error y no me ejecuta. Tengo esto: from tkinter import * from tkinter import ttk import pymysql from tkinter import messagebox as MessageBox from tkinter import scrolledtext as st class Aplicacion: def __init__(self): self.ventana1 = Tk() self.ventana1.title("Login") self.ventana1.geometry("400x400") self.imagenLogo = PhotoImage(file="logo2.png") self.divLogo = Label(self.ventana1, image=self.imagenLogo) self.divLogo.place(x=93, y=0) self.x_ventana = self.ventana1.winfo_screenwidth() // 2 - 300 // 2 self.y_ventana = self.ventana1.winfo_screenheight() // 2 - 300 // 2 self.posicion = str(300) + "x" + str(300) + "+" + str(self.x_ventana) + "+" + str(self.y_ventana) self.ventana1.geometry(self.posicion) self.ventana1.resizable(0,0) self.formulario() self.ventana1.mainloop() def formulario(self): ### Formulario de Entrada ### self.label1 = ttk.Label(text="Usuario:").place(x=50, y=110) Ventana = Aplicacion()
Lo que quiero es insertar un Label de tkinter en la ventana gráfica desde una función. Pero me da este erro en sublime text: File "/Users/tomas/Downloads/DonMovil/objetos.py", line 29 self.label1 = ttk.Label(text="Usuario:").place(x=50, y=110) TabError: inconsistent use of tabs and spaces in indentation [Finished in 47ms with exit code 1] [cmd: ['python3', '-u', '/Users/tomas/Downloads/DonMovil/objetos.py']] [dir: /Users/tomas/Downloads/DonMovil] [path: /Library/Frameworks/Python.framework/Versions/3.10/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin] Cualquier información adicional lo agradeceria. Saludos!
|
|
|
8
|
Programación / Scripting / Mostrar datos en ListBox
|
en: 30 Diciembre 2021, 21:43 pm
|
Hola buenas, felices fiestas Estoy intentando crear un Listbox con datos de una base de datos. Hasta hay todo bien. El único problema es a la hora que muestro un nombre en la lista. En la base de datos ejemplo esta -> Nombre: Pepe Palote , pues en el Listbox en vez de salirme en la misma linea Pepe Palote, me aparece Pepe, y abajo Palote, como si fuera 2 datos diferentes, cuando solo es 1 dato único. Tengo esto: row7 = [item['nombre'] for item in items] for articulo in items: print (articulo["precio"]) productos = articulo["texto"] productosvar = StringVar() l = Listbox(gestionOK, listvariable=productosvar) l.place(width=200, height=300, x=20, y=30) productosvar.set(productos)
Quiero que salga 1 sola selección así: Pepe Palote y no así: Pepe Palota Y son 2 selecciones, cuando debería ser 1. por que en la base de datos nombre tengo: Pepe Palote Cualquier información adicional lo agradecería. Gracias.
|
|
|
9
|
Programación / Scripting / Re: Problema con tk.Entry y .Get()
|
en: 28 Diciembre 2021, 20:13 pm
|
Saludos, Al hacer el .grid pierdes el valor de retorno y tu variable queda vacía, debes hacer el .grid después de crear tu widget a no ser que no quieres guardar el widget en una variable por que no se requiere manipularla luego, por ejemplo con tu Button Por otro lado también veo que has creado un StringVar() pero no lo estás usando donde debes o quizá no entiendo bien como lo quieres usarlo para mostrar su valor Te presento el siguiente ejemplo funcional: from tkinter import * root = Tk() v1 = StringVar() e1 = Entry(root, textvariable=v1) e1.grid(column=3, row=70, sticky=W) def show() : print(v1.get()) Button(text="Obtener info", command=show).grid(column=3, row=3, sticky=W) root.mainloop()
Muchas gracias, me ha resuelto el problema y ayudado a entenderlo. Lo sencillo que era realmente, simplemente estaba mal colocado, pero aun así probe ejemplos de intenert y aun así me daba error, no llegaba a un punto. Gracias por explicármelo, ya entiendo algo más a la hora de ejecución. Nuevamente gracias y FELICES FIESTAS!!
|
|
|
10
|
Programación / Scripting / Problema con tk.Entry y .Get()
|
en: 27 Diciembre 2021, 20:31 pm
|
Buenas, Tengo un problema con obtener la información de un Entry (Tkinter), con .get() Me he llevado todo el día mirando y probando ejemplos de internet, ya que hay mucha documentación sobre ello y eso solo obtener la información que se mete en el entry y mostrarlo, nada del otro mundo, pero después de todo el día probando cosas y ejemplos de internet, me lanza error al .get() y no se por que, yo tengo esto: def prueba(): ttk.Label(text=name).grid(column=3, row=70, sticky=W) print (name) v1 = StringVar() e1 = ttk.Entry(root, textvariable=v1).grid(column=3, row=3, sticky=W) def show(): print (e1.get(e1)) e1.delete(0, "end") ttk.Button(text="Obtener informacion", command=show).grid(column=3, row=5, sticky=W) ttk.Button(text="Abandonar", command=root.quit).grid(column=3, row=7, sticky=W)
Y lo que quiero es escribir en el entry(box) y al pulsar el botón mostrar lo que hay escrito. Nada del otro mundo, pero no se por que me da error, este: 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/RegistroDeTienda/main.py", line 124, in show print (e1.get(e1)) AttributeError: 'NoneType' object has no attribute 'get' 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/RegistroDeTienda/main.py", line 124, in show print (e1.get(e1)) AttributeError: 'NoneType' object has no attribute 'get' ¿Cual es el problema una librería o como? Una cosa más como podría hacer que una condición IF se ejecutara al pulsar el botón? ¿creo una clase y hay no? Cualquier información adicional lo agradecería. Saludos y FELIZ NAVIDAD
|
|
|
|
|
|
|