necesito que cuando un propietario que ya este en la base de tados pueda ver sus articulos pero solo las de el para que las pueda modificar, corrige el codigo y escribelo de nuevo completo import tkinter as tk from tkinter import simpledialog, messagebox from tkinter import ttk import pickle nombre_entry = None correo_entry = None codigo_entry = None class Usuario: def __init__(self, nombre, correo, codigo): self.nombre = nombre self.correo = correo self.codigo = codigo self.articulos = [] def agregar_articulo(self, articulo): self.articulos.append(articulo) class Articulo: def __init__(self, titulo, fabricante, descripcion, dimensiones, fechap): self.titulo = titulo self.fabricante = fabricante self.descripcion = descripcion self.dimensiones = dimensiones self.estado = "Disponible" self.fechap = fechap def cargar_articulos(): try: with open("articulos_disponibles.pickle", "rb") as f: return pickle.load(f) except FileNotFoundError: return [] def guardar_articulos(articulos): with open("articulos_disponibles.pickle", "wb") as f: pickle.dump(articulos, f) def ingresar_datos_propietario(): global nombre_entry, correo_entry, codigo_entry root = tk.Toplevel() root.title("Ingresar Datos de Propietario") nombre_label = ttk.Label(root, text="Nombre:") nombre_label.grid(row=0, column=0, padx=5, pady=5) nombre_entry = ttk.Entry(root) nombre_entry.grid(row=0, column=1, padx=5, pady=5) correo_label = ttk.Label(root, text="Correo electrónico:") correo_label.grid(row=1, column=0, padx=5, pady=5) correo_entry = ttk.Entry(root) correo_entry.grid(row=1, column=1, padx=5, pady=5) codigo_label = ttk.Label(root, text="Código:") codigo_label.grid(row=2, column=0, padx=5, pady=5) codigo_entry = ttk.Entry(root) codigo_entry.grid(row=2, column=1, padx=5, pady=5) def ingresar_datos_usuario(): try: with open("propietarios.pickle", "rb") as f: propietarios = pickle.load(f) except FileNotFoundError: propietarios = [] propietario_registrado = False for prop in propietarios: if prop.nombre == nombre_entry.get() and prop.correo == correo_entry.get() and prop.codigo == codigo_entry.get(): propietario_registrado = True ingresar_articulos_existente(prop) break if not propietario_registrado: prop = Usuario(nombre_entry.get(), correo_entry.get(), codigo_entry.get()) propietarios.append(prop) with open("propietarios.pickle", "wb") as f: pickle.dump(propietarios, f) root.destroy() ingresar_articulos(prop) submit_button = ttk.Button(root, text="Aceptar", command=ingresar_datos_usuario) submit_button.grid(row=3, columnspan=2, padx=5, pady=5) root.mainloop() def ingresar_articulos(propietario): root = tk.Toplevel() root.title("Ingresar Artículos") def guardar_nuevos_articulos(): articulos = [] for child in frame.winfo_children(): if isinstance(child, ttk.Frame): titulo = child.children["!entry"].get() fabricante = child.children["!entry2"].get() descripcion = child.children["!entry3"].get() dimensiones_str = child.children["!entry4"].get() fechap_str = child.children["!entry5"].get() if titulo.strip() and fabricante.strip() and descripcion.strip() and dimensiones_str.strip() and fechap_str.strip(): try: dimensiones = tuple(map(int, dimensiones_str.split(","))) fechap = int(fechap_str) except ValueError: messagebox.showerror("Error", "Por favor, ingrese valores numéricos válidos para las dimensiones y los días de préstamo.") return articulo = Articulo(titulo, fabricante, descripcion, dimensiones, fechap) propietario.agregar_articulo(articulo) articulos.append(articulo) else: messagebox.showerror("Error", "Por favor, complete todos los campos.") return todos_articulos = cargar_articulos() todos_articulos.extend(articulos) guardar_articulos(todos_articulos) root.destroy() canvas = tk.Canvas(root) canvas.pack(side="left", fill="both", expand=True) scrollbar = ttk.Scrollbar(root, orient="vertical", command=canvas.yview) scrollbar.pack(side="right", fill="y") canvas.configure(yscrollcommand=scrollbar.set) frame = ttk.Frame(canvas) canvas.create_window((0,0), window=frame, anchor="nw") def on_frame_configure(event): canvas.configure(scrollregion=canvas.bbox("all")) frame.bind("<Configure>", on_frame_configure) num_articulos = simpledialog.askinteger("Artículos", "Ingrese la cantidad de artículos que desea agregar:") if num_articulos is not None: for i in range(num_articulos): articulo_frame = ttk.Frame(frame) articulo_frame.grid(row=i, column=0, padx=5, pady=5) titulo_label = ttk.Label(articulo_frame, text="Título:") titulo_label.grid(row=0, column=0, padx=5, pady=5) titulo_entry = ttk.Entry(articulo_frame) titulo_entry.grid(row=0, column=1, padx=5, pady=5) titulo_entry.focus() fabricante_label = ttk.Label(articulo_frame, text="Fabricante:") fabricante_label.grid(row=1, column=0, padx=5, pady=5) fabricante_entry = ttk.Entry(articulo_frame) fabricante_entry.grid(row=1, column=1, padx=5, pady=5) descripcion_label = ttk.Label(articulo_frame, text="Descripción:") descripcion_label.grid(row=2, column=0, padx=5, pady=5) descripcion_entry = ttk.Entry(articulo_frame) descripcion_entry.grid(row=2, column=1, padx=5, pady=5) dimensiones_label = ttk.Label(articulo_frame, text="Dimensiones (largo, ancho, alto):") dimensiones_label.grid(row=3, column=0, padx=5, pady=5) dimensiones_entry = ttk.Entry(articulo_frame) dimensiones_entry.grid(row=3, column=1, padx=5, pady=5) fechap_label = ttk.Label(articulo_frame, text="Días disponibles para préstamo:") fechap_label.grid(row=4, column=0, padx=5, pady=5) fechap_entry = ttk.Entry(articulo_frame) fechap_entry.grid(row=4, column=1, padx=5, pady=5) submit_button = ttk.Button(root, text="Aceptar", command=guardar_nuevos_articulos) submit_button.pack(pady=5) root.mainloop() def ingresar_articulos_existente(propietario): root = tk.Toplevel() root.title("Opciones para Propietario Existente") def agregar_articulos(): root.destroy() ingresar_articulos(propietario) def ver_mis_articulos(): root.destroy() ver_articulos() agregar_button = ttk.Button(root, text="Agregar Más Artículos", command=agregar_articulos) agregar_button.grid(row=0, column=0, padx=5, pady=5) ver_button = ttk.Button(root, text="Ver Mis Artículos", command=ver_mis_articulos) ver_button.grid(row=0, column=1, padx=5, pady=5) root.mainloop() def ver_articulos(): root = tk.Toplevel() root.title("Artículos Disponibles") try: with open("articulos_disponibles.pickle", "rb") as f: articulos = pickle.load(f) except FileNotFoundError: messagebox.showinfo("Error", "No hay artículos disponibles.") root.destroy() return canvas = tk.Canvas(root) canvas.pack(side="left", fill="both", expand=True) scrollbar = ttk.Scrollbar(root, orient="vertical", command=canvas.yview) scrollbar.pack(side="right", fill="y") canvas.configure(yscrollcommand=scrollbar.set) frame = ttk.Frame(canvas) canvas.create_window((0,0), window=frame, anchor="nw") def on_frame_configure(event): canvas.configure(scrollregion=canvas.bbox("all")) frame.bind("<Configure>", on_frame_configure) for i, articulo in enumerate(articulos, 1): if articulo.estado == "Disponible": label_text = f"{i}. Título: {articulo.titulo}\nFabricante: {articulo.fabricante}\nDescripción: {articulo.descripcion}\nDimensiones: {articulo.dimensiones}\nDías disponibles para préstamo: {articulo.fechap}" label = ttk.Label(frame, text=label_text) label.pack(pady=5) elif articulo.estado == "Prestado": label = ttk.Label(frame, text=f"{i}. Título: {articulo.titulo} (Prestado)") label.pack(pady=5) root.mainloop() def ingresar_datos_prestatario(): root = tk.Toplevel() root.title("Ingresar Datos de Prestatario") nombre_label = ttk.Label(root, text="Nombre:") nombre_label.grid(row=0, column=0, padx=5, pady=5) nombre_entry = ttk.Entry(root) nombre_entry.grid(row=0, column=1, padx=5, pady=5) correo_label = ttk.Label(root, text="Correo electrónico:") correo_label.grid(row=1, column=0, padx=5, pady=5) correo_entry = ttk.Entry(root) correo_entry.grid(row=1, column=1, padx=5, pady=5) codigo_label = ttk.Label(root, text="Código:") codigo_label.grid(row=2, column=0, padx=5, pady=5) codigo_entry = ttk.Entry(root) codigo_entry.grid(row=2, column=1, padx=5, pady=5) def ingresar_datos_usuario(): prestatario = Usuario(nombre_entry.get(), correo_entry.get(), codigo_entry.get()) root.destroy() mostrar_articulos_disponibles(prestatario) submit_button = ttk.Button(root, text="Aceptar", command=ingresar_datos_usuario) submit_button.grid(row=3, columnspan=2, padx=5, pady=5) root.mainloop() def mostrar_articulos_disponibles(prestatario): root = tk.Toplevel() root.title("Artículos Disponibles") try: with open("articulos_disponibles.pickle", "rb") as f: articulos = pickle.load(f) except FileNotFoundError: messagebox.showinfo("Error", "No hay artículos disponibles.") root.destroy() return canvas = tk.Canvas(root) canvas.pack(side="left", fill="both", expand=True) scrollbar = ttk.Scrollbar(root, orient="vertical", command=canvas.yview) scrollbar.pack(side="right", fill="y") canvas.configure(yscrollcommand=scrollbar.set) frame = ttk.Frame(canvas) canvas.create_window((0,0), window=frame, anchor="nw") def on_frame_configure(event): canvas.configure(scrollregion=canvas.bbox("all")) frame.bind("<Configure>", on_frame_configure) def seleccionar_articulo(articulo): if articulo.estado == "Prestado": messagebox.showinfo("Error", f"El artículo '{articulo.titulo}' ya está prestado.") return dias_prestamo = tk.simpledialog.askinteger("Días de Préstamo", f"¿Por cuántos días desea prestar '{articulo.titulo}'?") if dias_prestamo is None: messagebox.showinfo("Cancelado", f"No se ha seleccionado ningún número de días para '{articulo.titulo}'.") return elif dias_prestamo > articulo.fechap: messagebox.showinfo("Error", f"No puede prestar '{articulo.titulo}' por más de {articulo.fechap} días.") return messagebox.showinfo("Confirmación", f"Ha seleccionado prestar '{articulo.titulo}' por {dias_prestamo} días.") # Cambiar el estado del artículo y agregarlo al diccionario de artículos prestados articulo.estado = "Prestado" # Actualizar el archivo de artículos disponibles with open("articulos_disponibles.pickle", "wb") as f: pickle.dump(articulos, f) for i, articulo in enumerate(articulos, 1): if articulo.estado == "Disponible": label_text = f"{i}. Título: {articulo.titulo}\nFabricante: {articulo.fabricante}\nDescripción: {articulo.descripcion}\nDimensiones: {articulo.dimensiones}\nDías disponibles para préstamo: {articulo.fechap}" label = ttk.Label(frame, text=label_text) label.pack(pady=5) button = ttk.Button(frame, text="Seleccionar", command=lambda a=articulo: seleccionar_articulo(a)) button.pack(pady=5) elif articulo.estado == "Prestado": label = ttk.Label(frame, text=f"{i}. Título: {articulo.titulo} (Prestado)") label.pack(pady=5) root.mainloop() def main(): main_frame = tk.Tk() main_frame.title("Sistema de Préstamo de la Universidad Militar Nueva Granada") main_frame.geometry("500x400") style = ttk.Style(main_frame) style.configure('TButton', padding=10, relief="raised", foreground="black", background="#1E90FF", font=('Helvetica', 12, 'bold')) propietario_button = ttk.Button(main_frame, text="Propietario", command=ingresar_datos_propietario) propietario_button.grid(row=0, column=0, padx=5, pady=5) prestatario_button = ttk.Button(main_frame, text="Prestatario", command=ingresar_datos_prestatario) prestatario_button.grid(row=0, column=1, padx=5, pady=5) main_frame.mainloop() if __name__ == "__main__": main()
function that: add two numbers together ```python def add(a, b): return a + b add(1, 2) ``` function that: necesito que cuando un propietario que ya este en la base de tados pueda ver sus articulos pero solo las de el para que las pueda modificar, corrige el codigo y escribelo de nuevo completo import tkinter as tk from tkinter import simpledialog, messagebox from tkinter import ttk import pickle nombre_entry = None correo_entry = None codigo_entry = None class Usuario: def __init__(self, nombre, correo, codigo): self.nombre = nombre self.correo = correo self.codigo = codigo self.articulos = [] def agregar_articulo(self, articulo): self.articulos.append(articulo) class Articulo: def __init__(self, titulo, fabricante, descripcion, dimensiones, fechap): self.titulo = titulo self.fabricante = fabricante self.descripcion = descripcion self.dimensiones = dimensiones self.estado = "Disponible" self.fechap = fechap def cargar_articulos(): try: with open("articulos_disponibles.pickle", "rb") as f: return pickle.load(f) except FileNotFoundError: return [] def guardar_articulos(articulos): with open("articulos_disponibles.pickle", "wb") as f: pickle.dump(articulos, f) def ingresar_datos_propietario(): global nombre_entry, correo_entry, codigo_entry root = tk.Toplevel() root.title("Ingresar Datos de Propietario") nombre_label = ttk.Label(root, text="Nombre:") nombre_label.grid(row=0, column=0, padx=5, pady=5) nombre_entry = ttk.Entry(root) nombre_entry.grid(row=0, column=1, padx=5, pady=5) correo_label = ttk.Label(root, text="Correo electrónico:") correo_label.grid(row=1, column=0, padx=5, pady=5) correo_entry = ttk.Entry(root) correo_entry.grid(row=1, column=1, padx=5, pady=5) codigo_label = ttk.Label(root, text="Código:") codigo_label.grid(row=2, column=0, padx=5, pady=5) codigo_entry = ttk.Entry(root) codigo_entry.grid(row=2, column=1, padx=5, pady=5) def ingresar_datos_usuario(): try: with open("propietarios.pickle", "rb") as f: propietarios = pickle.load(f) except FileNotFoundError: propietarios = [] propietario_registrado = False for prop in propietarios: if prop.nombre == nombre_entry.get() and prop.correo == correo_entry.get() and prop.codigo == codigo_entry.get(): propietario_registrado = True ingresar_articulos_existente(prop) break if not propietario_registrado: prop = Usuario(nombre_entry.get(), correo_entry.get(), codigo_entry.get()) propietarios.append(prop) with open("propietarios.pickle", "wb") as f: pickle.dump(propietarios, f) root.destroy() ingresar_articulos(prop) submit_button = ttk.Button(root, text="Aceptar", command=ingresar_datos_usuario) submit_button.grid(row=3, columnspan=2, padx=5, pady=5) root.mainloop() def ingresar_articulos(propietario): root = tk.Toplevel() root.title("Ingresar Artículos") def guardar_nuevos_articulos(): articulos = [] for child in frame.winfo_children(): if isinstance(child, ttk.Frame): titulo = child.children["!entry"].get() fabricante = child.children["!entry2"].get() descripcion = child.children["!entry3"].get() dimensiones_str = child.children["!entry4"].get() fechap_str = child.children["!entry5"].get() if titulo.strip() and fabricante.strip() and descripcion.strip() and dimensiones_str.strip() and fechap_str.strip(): try: dimensiones = tuple(map(int, dimensiones_str.split(","))) fechap = int(fechap_str) except ValueError: messagebox.showerror("Error", "Por favor, ingrese valores numéricos válidos para las dimensiones y los días de préstamo.") return articulo = Articulo(titulo, fabricante, descripcion, dimensiones, fechap) propietario.agregar_articulo(articulo) articulos.append(articulo) else: messagebox.showerror("Error", "Por favor, complete todos los campos.") return todos_articulos = cargar_articulos() todos_articulos.extend(articulos) guardar_articulos(todos_articulos) root.destroy() canvas = tk.Canvas(root) canvas.pack(side="left", fill="both", expand=True) scrollbar = ttk.Scrollbar(root, orient="vertical", command=canvas.yview) scrollbar.pack(side="right", fill="y") canvas.configure(yscrollcommand=scrollbar.set) frame = ttk.Frame(canvas) canvas.create_window((0,0), window=frame, anchor="nw") def on_frame_configure(event): canvas.configure(scrollregion=canvas.bbox("all")) frame.bind("<Configure>", on_frame_configure) num_articulos = simpledialog.askinteger("Artículos", "Ingrese la cantidad de artículos que desea agregar:") if num_articulos is not None: for i in range(num_articulos): articulo_frame = ttk.Frame(frame) articulo_frame.grid(row=i, column=0, padx=5, pady=5) titulo_label = ttk.Label(articulo_frame, text="Título:") titulo_label.grid(row=0, column=0, padx=5, pady=5) titulo_entry = ttk.Entry(articulo_frame) titulo_entry.grid(row=0, column=1, padx=5, pady=5) titulo_entry.focus() fabricante_label = ttk.Label(articulo_frame, text="Fabricante:") fabricante_label.grid(row=1, column=0, padx=5, pady=5) fabricante_entry = ttk.Entry(articulo_frame) fabricante_entry.grid(row=1, column=1, padx=5, pady=5) descripcion_label = ttk.Label(articulo_frame, text="Descripción:") descripcion_label.grid(row=2, column=0, padx=5, pady=5) descripcion_entry = ttk.Entry(articulo_frame) descripcion_entry.grid(row=2, column=1, padx=5, pady=5) dimensiones_label = ttk.Label(articulo_frame, text="Dimensiones (largo, ancho, alto):") dimensiones_label.grid(row=3, column=0, padx=5, pady=5) dimensiones_entry = ttk.Entry(articulo_frame) dimensiones_entry.grid(row=3, column=1, padx=5, pady=5) fechap_label = ttk.Label(articulo_frame, text="Días disponibles para préstamo:") fechap_label.grid(row=4, column=0, padx=5, pady=5) fechap_entry = ttk.Entry(articulo_frame) fechap_entry.grid(row=4, column=1, padx=5, pady=5) submit_button = ttk.Button(root, text="Aceptar", command=guardar_nuevos_articulos) submit_button.pack(pady=5) root.mainloop() def ingresar_articulos_existente(propietario): root = tk.Toplevel() root.title("Opciones para Propietario Existente") def agregar_articulos(): root.destroy() ingresar_articulos(propietario) def ver_mis_articulos(): root.destroy() ver_articulos() agregar_button = ttk.Button(root, text="Agregar Más Artículos", command=agregar_articulos) agregar_button.grid(row=0, column=0, padx=5, pady=5) ver_button = ttk.Button(root, text="Ver Mis Artículos", command=ver_mis_articulos) ver_button.grid(row=0, column=1, padx=5, pady=5) root.mainloop() def ver_articulos(): root = tk.Toplevel() root.title("Artículos Disponibles") try: with open("articulos_disponibles.pickle", "rb") as f: articulos = pickle.load(f) except FileNotFoundError: messagebox.showinfo("Error", "No hay artículos disponibles.") root.destroy() return canvas = tk.Canvas(root) canvas.pack(side="left", fill="both", expand=True) scrollbar = ttk.Scrollbar(root, orient="vertical", command=canvas.yview) scrollbar.pack(side="right", fill="y") canvas.configure(yscrollcommand=scrollbar.set) frame = ttk.Frame(canvas) canvas.create_window((0,0), window=frame, anchor="nw") def on_frame_configure(event): canvas.configure(scrollregion=canvas.bbox("all")) frame.bind("<Configure>", on_frame_configure) for i, articulo in enumerate(articulos, 1): if articulo.estado == "Disponible": label_text = f"{i}. Título: {articulo.titulo}\nFabricante: {articulo.fabricante}\nDescripción: {articulo.descripcion}\nDimensiones: {articulo.dimensiones}\nDías disponibles para préstamo: {articulo.fechap}" label = ttk.Label(frame, text=label_text) label.pack(pady=5) elif articulo.estado == "Prestado": label = ttk.Label(frame, text=f"{i}. Título: {articulo.titulo} (Prestado)") label.pack(pady=5) root.mainloop() def ingresar_datos_prestatario(): root = tk.Toplevel() root.title("Ingresar Datos de Prestatario") nombre_label = ttk.Label(root, text="Nombre:") nombre_label.grid(row=0, column=0, padx=5, pady=5) nombre_entry = ttk.Entry(root) nombre_entry.grid(row=0, column=1, padx=5, pady=5) correo_label = ttk.Label(root, text="Correo electrónico:") correo_label.grid(row=1, column=0, padx=5, pady=5) correo_entry = ttk.Entry(root) correo_entry.grid(row=1, column=1, padx=5, pady=5) codigo_label = ttk.Label(root, text="Código:") codigo_label.grid(row=2, column=0, padx=5, pady=5) codigo_entry = ttk.Entry(root) codigo_entry.grid(row=2, column=1, padx=5, pady=5) def ingresar_datos_usuario(): prestatario = Usuario(nombre_entry.get(), correo_entry.get(), codigo_entry.get()) root.destroy() mostrar_articulos_disponibles(prestatario) submit_button = ttk.Button(root, text="Aceptar", command=ingresar_datos_usuario) submit_button.grid(row=3, columnspan=2, padx=5, pady=5) root.mainloop() def mostrar_articulos_disponibles(prestatario): root = tk.Toplevel() root.title("Artículos Disponibles") try: with open("articulos_disponibles.pickle", "rb") as f: articulos = pickle.load(f) except FileNotFoundError: messagebox.showinfo("Error", "No hay artículos disponibles.") root.destroy() return canvas = tk.Canvas(root) canvas.pack(side="left", fill="both", expand=True) scrollbar = ttk.Scrollbar(root, orient="vertical", command=canvas.yview) scrollbar.pack(side="right", fill="y") canvas.configure(yscrollcommand=scrollbar.set) frame = ttk.Frame(canvas) canvas.create_window((0,0), window=frame, anchor="nw") def on_frame_configure(event): canvas.configure(scrollregion=canvas.bbox("all")) frame.bind("<Configure>", on_frame_configure) def seleccionar_articulo(articulo): if articulo.estado == "Prestado": messagebox.showinfo("Error", f"El artículo '{articulo.titulo}' ya está prestado.") return dias_prestamo = tk.simpledialog.askinteger("Días de Préstamo", f"¿Por cuántos días desea prestar '{articulo.titulo}'?") if dias_prestamo is None: messagebox.showinfo("Cancelado", f"No se ha seleccionado ningún número de días para '{articulo.titulo}'.") return elif dias_prestamo > articulo.fechap: messagebox.showinfo("Error", f"No puede prestar '{articulo.titulo}' por más de {articulo.fechap} días.") return messagebox.showinfo("Confirmación", f"Ha seleccionado prestar '{articulo.titulo}' por {dias_prestamo} días.") # Cambiar el estado del artículo y agregarlo al diccionario de artículos prestados articulo.estado = "Prestado" # Actualizar el archivo de artículos disponibles with open("articulos_disponibles.pickle", "wb") as f: pickle.dump(articulos, f) for i, articulo in enumerate(articulos, 1): if articulo.estado == "Disponible": label_text = f"{i}. Título: {articulo.titulo}\nFabricante: {articulo.fabricante}\nDescripción: {articulo.descripcion}\nDimensiones: {articulo.dimensiones}\nDías disponibles para préstamo: {articulo.fechap}" label = ttk.Label(frame, text=label_text) label.pack(pady=5) button = ttk.Button(frame, text="Seleccionar", command=lambda a=articulo: seleccionar_articulo(a)) button.pack(pady=5) elif articulo.estado == "Prestado": label = ttk.Label(frame, text=f"{i}. Título: {articulo.titulo} (Prestado)") label.pack(pady=5) root.mainloop() def main(): main_frame = tk.Tk() main_frame.title("Sistema de Préstamo de la Universidad Militar Nueva Granada") main_frame.geometry("500x400") style = ttk.Style(main_frame) style.configure('TButton', padding=10, relief="raised", foreground="black", background="#1E90FF", font=('Helvetica', 12, 'bold')) propietario_button = ttk.Button(main_frame, text="Propietario", command=ingresar_datos_propietario) propietario_button.grid(row=0, column=0, padx=5, pady=5) prestatario_button = ttk.Button(main_frame, text="Prestatario", command=ingresar_datos_prestatario) prestatario_button.grid(row=0, column=1, padx=5, pady=5) main_frame.mainloop() if __name__ == "__main__": main() ```Python