class Aplicacion: def __init__(self): #************************************************************************* #Crea un objeto TK #************************************************************************* self.raiz = Tk() self.raiz.title ("Mantenimiento de Personas") self.raiz.geometry('900x600') #************************************************************************* #crea el menu de la pantalla #************************************************************************* menubar = Menu(self.raiz) self.raiz.config(menu=menubar) filemenu = Menu(menubar, tearoff=0) filemenu.add_command(label="Acerca de..") filemenu.add_separator() filemenu.add_command(label="Salir", command=self.raiz.quit) mantmenu = Menu(menubar, tearoff=0) mantmenu.add_command(label="Personas") mantmenu.add_command(label="Teléfonos") mantmenu.add_command(label="Direcciones") menubar.add_cascade(label="Archivo", menu=filemenu) menubar.add_cascade(label="Mantenimiento", menu=mantmenu) #************************************************************************* #crea un objeto tipo fuenta #************************************************************************* self.fuente = font.Font(weight="bold") #************************************************************************* #se crean atributos de la clase #************************************************************************* self.t_gustos = Gustos.Gustos() #se crea el objeto de dominio para guardar la información self.insertando = True #************************************************************************* #se crean los campos de la pantalla #************************************************************************* #Se coloca un label del titulo self.lb_tituloPantalla = Label(self.raiz, text = "MANTENIMIENTO DE GUSTOS", font = self.fuente) self.lb_tituloPantalla.place(x = 320, y = 20) #colocar por medio de espacion en pixeles de la parte superior de la pantalla considerando un eje x y un eje y #coloca en el formulario el campo y el label de idNombre Gustos self.lb_cedula = Label(self.raiz, text = "id Nombre Gustos:") self.lb_cedula.place(x = 240, y = 60) self.txt_cedula = Entry(self.raiz, textvariable=self.t_gustos.idNombreGustos, justify="right") self.txt_cedula.place(x = 370, y = 60) #coloca en el formulario el campo y el label de descripcion gustos self.lb_nombre = Label(self.raiz, text = "Descripcion de los Gustos:") self.lb_nombre.place(x = 240, y = 90) self.txt_nombre = Entry(self.raiz, textvariable=self.t_gustos.descripcionGustos, justify="right", width=30) self.txt_nombre.place(x = 370, y = 90) #coloca en el formulario el campo y el label de idUsuario _TGustos self.lb_apellido1 = Label(self.raiz, text = "id Usuario_TGustos:") self.lb_apellido1.place(x = 240, y = 120) self.txt_apellido1 = Entry(self.raiz, textvariable=self.t_gustos.idUsuario_TGustos, justify="right", width=30) self.txt_apellido1.place(x = 370, y = 120) #coloca en el formulario el campo y el label de nombre gustos self.lb_apellido2 = Label(self.raiz, text = "Nombre gustos:") self.lb_apellido2.place(x = 240, y = 150) self.txt_apellido2 = Entry(self.raiz, textvariable=self.t_gustos.nombreGustos, justify="right", width=30) self.txt_apellido2.place(x = 370, y = 150) #coloca los botones enviar y borrar self.bt_borrar = Button(self.raiz, text="Limpiar", width=15, command = self.limpiarInformacion) self.bt_borrar.place(x = 370, y = 330) self.bt_enviar = Button(self.raiz, text="Enviar", width=15, command = self.enviarInformacion) self.bt_enviar.place(x = 510, y = 330) #Se coloca un label del informacion self.lb_tituloPantalla = Label(self.raiz, text = "INFORMACIÓN INCLUIDA", font = self.fuente) self.lb_tituloPantalla.place(x = 350, y = 360) #colocar por medio de espacion en pixeles de la parte superior de la pantalla considerando un eje x y un eje y #************************************************************************* #tabla con informacion #************************************************************************* self.sheet = Sheet(self.raiz, page_up_down_select_row = True, #empty_vertical = 0, column_width = 120, startup_select = (0,1,"rows"), #row_height = "4", #default_row_index = "numbers", #default_header = "both", #empty_horizontal = 0, #show_vertical_grid = False, #show_horizontal_grid = False, #auto_resize_default_row_index = False, #header_height = "3", #row_index_width = 100, #align = "center", #header_align = "w", #row_index_align = "w", #data = [[f"Row {r}, Column {c}\nnewline1\nnewline2" for c in range(50)] for r in range(1000)], #to set sheet data at startup headers = ['idNombreGustos', 'nombreGstos', 'DescripcionGustos','idUsuario','nombreGustos'], #row_index = [f"Row {r}\nnewline1\nnewline2" for r in range(2000)], #set_all_heights_and_widths = True, #to fit all cell sizes to text at start up #headers = 0, #to set headers as first row at startup #headers = [f"Column {c}\nnewline1\nnewline2" for c in range(30)], #theme = "light green", #row_index = 0, #to set row_index as first column at startup #total_rows = 2000, #if you want to set empty sheet dimensions at startup #total_columns = 30, #if you want to set empty sheet dimensions at startup height = 195, #height and width arguments are optional width = 720 #For full startup arguments see DOCUMENTATION.md ) #self.sheet.hide("row_index") #self.sheet.hide("header") #self.sheet.hide("top_left") self.sheet.enable_bindings(("single_select", #"single_select" or "toggle_select" "column_select", "row_select", "column_width_resize", "double_click_column_resize", #"row_width_resize", #"column_height_resize", "arrowkeys", "row_height_resize", "double_click_row_resize", "right_click_popup_menu", "rc_select", "rc_insert_column", "rc_delete_column", "rc_insert_row", "rc_delete_row")) #self.sheet.disable_bindings() #uses the same strings #self.sheet.enable_bindings() self.sheet.place(x = 20, y = 390) #coloca los botones cargar y eliminar self.bt_cargar = Button(self.raiz, text="Cargar", width=15, command = self.cargarInformacion) self.bt_cargar.place(x = 750, y = 385) self.bt_eliminar = Button(self.raiz, text="Eliminar", width=15, command = self.eliminarInformacion) self.bt_eliminar.place(x = 750, y = 425) self.cargarTodaInformacion() #************************************************************************* #se inicial el main loop de la pantalla #************************************************************************* self.raiz.mainloop() #************************************************************************* #Metodo para consultar la información de la base de datos para #cargarla en la tabla #************************************************************************* def cargarTodaInformacion(self): try: self.gustosBo = GustosBO.GustosBO() #se crea un objeto de logica de negocio resultado = self.gustosBo.consultar() self.sheet.set_sheet_data(resultado) except Exception as e: msg.showerror("Error", str(e)) #si se genera algun tipo de error muestra un mensache con dicho error #************************************************************************* #Metodo para cargar informacion #************************************************************************* def cargarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() idNombreGustos = (self.sheet.get_cell_data(datoSeleccionado[0],0)) self.t_gustos.idNombreGustos.set(idNombreGustos) self.gustosBo = GustosBO.GustosBO() #se crea un objeto de logica de negocio self.gustosBo.consultarGustos(self.t_gustos) #se envia a consultar self.insertando = False msg.showinfo("Acción: Consultar el gusto", "La información del gusto ha sido consultada correctamente") # Se muestra el mensaje de que todo esta correcto except Exception as e: msg.showerror("Error", str(e)) #si se genera algun tipo de error muestra un mensache con dicho error #************************************************************************* #Metodo para cargar eliminar la informacion #************************************************************************* def eliminarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() idNombreGustos = (self.sheet.get_cell_data(datoSeleccionado[0],0)) gusto = (self.sheet.get_cell_data(datoSeleccionado[0],1)) resultado = msg.askquestion("Eliminar", "¿Desear eliminar a "+gusto+" de la base de datos?") if resultado == "yes": self.t_gustos.idNombreGustos.set(idNombreGustos) self.gustosBo = GustosBO.GustosBO() #se crea un objeto de logica de negocio self.gustosBo.eliminar(self.t_gustos) #se envia a consultar self.cargarTodaInformacion() self.t_gustos.limpiar() except Exception as e: msg.showerror("Error", str(e)) #si se genera algun tipo de error muestra un mensache con dicho error #************************************************************************* #Metodo para enviar la información a la base de datos #************************************************************************* def enviarInformacion(self): try: self.gustosBo = GustosBO.GustosBO() #se crea un objeto de logica de negocio if(self.insertando == True): self.gustosBo.guardar(self.t_gustos) else: self.gustosBo.modificar(self.t_gustos) self.cargarTodaInformacion() self.t_gustos.limpiar() #se limpia el formulario if(self.insertando == True): msg.showinfo("Acción: Agregar el gusto", "La información de los gustos ha sido incluida correctamente") # Se muestra el mensaje de que todo esta correcto else: msg.showinfo("Acción: Agregar modificar", "La información de los gustos ha sido modificada correctamente") # Se muestra el mensaje de que todo esta correcto except Exception as e: msg.showerror("Error", str(e)) #si se genera algun tipo de error muestra un mensache con dicho error #************************************************************************* #Metodo para limpiar el formulario #************************************************************************* def limpiarInformacion(self): self.t_gustos.limpiar() #llama al metodo de la clase gustos para limpiar los atritudos de la clase self.insertando = True msg.showinfo("Acción del sistema", "La información del formulario ha sido eliminada correctamente") # muestra un mensaje indicando que se limpio el formulario #************************************************************************* #Metodo para mostrar un contro tipo datepicker #************************************************************************* def mostrarDatePicker(self): self.top = Toplevel(self.raiz) self.cal = Calendar(self.top, font="Arial 14", selectmode='day', locale='en_US', cursor="hand", year=2019, month=6, day=16) self.cal.pack(fill="both", expand=True) ttk.Button(self.top, text="Seleccionar").pack()
class Directorio_F: def __init__(self): #Pantalla self.raiz = Tk() self.raiz.title("Mantenimiento de Factura") self.raiz.geometry('600x730') #Barra menu menubar = Menu(self.raiz) self.raiz.config(menu=menubar) filemenu = Menu(menubar, tearoff=0) filemenu.add_command(label="Salir", command=self.raiz.quit) mantmenu = Menu(menubar, tearoff=0) mantmenu.add_command(label="Clientes", command=self.abrir_C) mantmenu.add_command(label="Articulos", command=self.abrir_A) mantmenu.add_command(label="Proveedores", command=self.abrir_p) mantmenu.add_command(label="Conexion", command=self.abrir_R) menubar.add_cascade(label="Archivo", menu=filemenu) menubar.add_cascade(label="Mantenimiento", menu=mantmenu) #Objeto Factura self.fuente = font.Font(weight="bold") self.factura = Factura.Factura() self.insertando = True #Titulo self.lb_tituloPantalla = Label(self.raiz, text="MANTENIMIENTO DE FACTURA", font=self.fuente) self.lb_tituloPantalla.place(x=190, y=20) #Formulario #ID factura self.lb_cedula = Label(self.raiz, text="ID factura:") self.lb_cedula.place(x=150, y=60) self.txt_cedula = Entry(self.raiz, textvariable=self.factura.PK_N_FACTURA, justify="right") self.txt_cedula.place(x=300, y=60) #Cedula self.lb_nombre = Label(self.raiz, text="Cedula:") self.lb_nombre.place(x=150, y=90) self.txt_nombre = Entry(self.raiz, textvariable=self.factura.FK_CEDULA, justify="right") self.txt_nombre.place(x=300, y=90) #Tiempo self.lb_apellido2 = Label(self.raiz, text="Tiempo utilizado") self.lb_apellido2.place(x=150, y=120) self.txt_apellido2 = Entry(self.raiz, textvariable=self.factura.TIEMPO_USO, justify="right", width=30) self.txt_apellido2.place(x=300, y=120) #Monto self.lb_apellido2 = Label(self.raiz, text="Monto Total:") self.lb_apellido2.place(x=150, y=150) self.txt_apellido2 = Entry(self.raiz, textvariable=self.factura.MONTO, justify="right", width=30) self.txt_apellido2.place(x=300, y=150) #Articulos asociados self.lb_apellido2 = Label(self.raiz, text="ID Articulo asociado:") self.lb_apellido2.place(x=150, y=180) self.txt_apellido2 = Entry(self.raiz, textvariable=self.factura.FK_ID_ART, justify="right") self.txt_apellido2.place(x=300, y=180) #Asociado #Se coloca un label del informacion self.lb_tituloPantalla = Label(self.raiz, text="INFORMACIÓN ASOCIADA", font=self.fuente) self.lb_tituloPantalla.place(x=200, y=270) #Nombre-cedula self.lb_apellido2 = Label(self.raiz, text="Nombre asociado:") self.lb_apellido2.place(x=150, y=310) self.txt_apellido2 = Entry(self.raiz, textvariable=self.factura.CLIENTE, justify="right", state="readonly", width=30) self.txt_apellido2.place(x=300, y=310) #Primer Apellido-cedula self.lb_apellido2 = Label(self.raiz, text="1.ª Apellido asociado:") self.lb_apellido2.place(x=150, y=340) self.txt_apellido2 = Entry(self.raiz, textvariable=self.factura.APELLIDO_1, justify="right", state="readonly", width=30) self.txt_apellido2.place(x=300, y=340) #Segundo Apellido-cedula self.lb_apellido2 = Label(self.raiz, text="2.ª Apellido asociado:") self.lb_apellido2.place(x=150, y=370) self.txt_apellido2 = Entry(self.raiz, textvariable=self.factura.APELLIDO_2, justify="right", state="readonly", width=30) self.txt_apellido2.place(x=300, y=370) #Nombre-articulo self.lb_apellido2 = Label(self.raiz, text="Nombre Articulo:") self.lb_apellido2.place(x=150, y=400) self.txt_apellido2 = Entry(self.raiz, textvariable=self.factura.ARTICULO, justify="right", state="readonly", width=30) self.txt_apellido2.place(x=300, y=400) #Botones #Boton Limpiar self.bt_borrar = Button(self.raiz, text="Limpiar", width=15, command=self.limpiarInformacion) self.bt_borrar.place(x=190, y=220) #Boton Enviar self.bt_enviar = Button(self.raiz, text="Enviar", width=15, command=self.enviarInformacion) self.bt_enviar.place(x=310, y=220) #Boton Cargar self.bt_borrar = Button(self.raiz, text="Cargar", width=15, command=self.cargarInformacion) self.bt_borrar.place(x=430, y=220) #Boton Eliminar self.bt_enviar = Button(self.raiz, text="Eliminar", width=15, command=self.eliminarInformacion) self.bt_enviar.place(x=550, y=220) self.bt_reporte = Button(self.raiz, text="Reporte", width=15, command=self.generarPDFListado) self.bt_reporte.place(x=670, y=220) #Se coloca un label del informacion self.lb_tituloPantalla = Label(self.raiz, text="INFORMACIÓN INCLUIDA", font=self.fuente) self.lb_tituloPantalla.place(x=200, y=440) self.sheet = Sheet(self.raiz, page_up_down_select_row=True, column_width=120, startup_select=(0, 1, "rows"), headers=[ 'Factura', 'Cedula', 'Tiempo uso', 'Monto', 'ID articulo' ], height=170, width=560) self.sheet.enable_bindings( ("single_select", "column_select", "row_select", "column_width_resize", "double_click_column_resize", "arrowkeys", "row_height_resize", "double_click_row_resize", "right_click_popup_menu", "rc_select", "rc_insert_column", "rc_delete_column", "rc_insert_row", "rc_delete_row")) self.sheet.place(x=20, y=480) self.cargarTodaInformacion() self.raiz.mainloop() def generarPDFListado(self): try: #Crea un objeto para la creación del PDF nombreArchivo = "ListadoPersonas.pdf" rep = reportPDF.Canvas(nombreArchivo) #Agrega el tipo de fuente Arial registerFont(TTFont('Arial', 'ARIAL.ttf')) #Crea el texto en donde se incluye la información textobject = rep.beginText() # Coloca el titulo textobject.setFont('Arial', 16) textobject.setTextOrigin(10, 800) textobject.setFillColor(colors.darkorange) textobject.textLine(text='LISTA DE FACTURA') #Escribe el titulo en el reportes rep.drawText(textobject) #consultar la informacion de la base de datos self.facturaBo = FacturaBO.FacturaBO( ) #se crea un objeto de logica de negocio informacion = self.facturaBo.consultar() #agrega los titulos de la tabla en la información consultada titulos = [ "Factura", "Cedula", "Tiempo uso", "Monto", "ID articulo" ] informacion.insert(0, titulos) #crea el objeto tabla para mostrar la información t = Table(informacion) #Le coloca el color tanto al borde de la tabla como de las celdas t.setStyle( TableStyle([("BOX", (0, 0), (-1, -1), 0.25, colors.black), ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black) ])) #para cambiar el color de las fichas de hace un ciclo según la cantidad de datos #que devuelve la base de datos data_len = len(informacion) for each in range(data_len): if each % 2 == 0: bg_color = colors.whitesmoke else: bg_color = colors.lightgrey if each == 0: #Le aplica un estilo diferente a la tabla t.setStyle( TableStyle([('BACKGROUND', (0, each), (-1, each), colors.orange)])) else: t.setStyle( TableStyle([('BACKGROUND', (0, each), (-1, each), bg_color)])) #acomoda la tabla según el espacio requerido aW = 840 aH = 780 w, h = t.wrap(aW, aH) t.drawOn(rep, 10, aH - h) #Guarda el archivo rep.save() #Abre el archivo desde comandos, puede variar en MacOs es open #subprocess.Popen("open '%s'" % nombreArchivo, shell=True) subprocess.Popen(nombreArchivo, shell=True) #Windows except IOError: msg.showerror("Error", "El archivo ya se encuentra abierto") #Limpiar def limpiarInformacion(self): self.factura.limpiar() msg.showinfo( "Acción del sistema", "La información del formulario ha sido eliminada correctamente") #envia la info def enviarInformacion(self): try: self.facturaBo = FacturaBO.FacturaBO( ) #se crea un objeto de logica de negocio if (self.insertando == True): self.facturaBo.guardar(self.factura) else: self.facturaBo.modificar(self.factura) self.cargarTodaInformacion() self.insertando = True self.factura.limpiar() #se limpia el formulario if (self.insertando == True): msg.showinfo( "Acción: Agregar factura", "La información de la factura ha sido incluida correctamente" ) # Se muestra el mensaje de que todo esta correcto else: msg.showinfo( "Acción: Modificar factura", "La información de la factura ha sido modificada correctamente" ) # Se muestra el mensaje de que todo esta correcto except Exception as e: msg.showerror( "Error", str(e) ) #si se genera algun tipo de error muestra un mensache con dicho error #eliminar la info def eliminarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() factura = (self.sheet.get_cell_data(datoSeleccionado[0], 0)) resultado = msg.askquestion( "Eliminar", "¿Desear eliminar a " + factura + " de la base de datos?") if resultado == "yes": self.factura.PK_N_FACTURA.set(factura) self.facturaBo = FacturaBO.FacturaBO() self.facturaBo.eliminar(self.factura) self.cargarTodaInformacion() self.factura.limpiar() except Exception as e: msg.showerror("Error", str(e)) #cargar toda la info def cargarTodaInformacion(self): try: self.facturaBo = FacturaBO.FacturaBO() resultado = self.facturaBo.consultar() self.sheet.set_sheet_data(resultado) except Exception as e: msg.showerror("Error", str(e)) #selecionado def cargarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() numero = (self.sheet.get_cell_data(datoSeleccionado[0], 0)) self.factura.PK_N_FACTURA.set(numero) self.facturaBo = FacturaBO.FacturaBO() self.facturaBo.consultarFactura(self.factura) self.insertando = False msg.showinfo( "Acción: Consultar factura", "La información de la factura ha sido consultada correctamente" ) except Exception as e: msg.showerror("Error", str(e)) #abrir def abrir_C(self): from mant_Cliente import Directorio_C self.raiz.destroy() Directorio_C() def abrir_A(self): from mant_Articulos import Directorio_A self.raiz.destroy() Directorio_A() def abrir_p(self): from mant_Proveedor import Directorio_P self.raiz.destroy() Directorio_P() def abrir_R(self): from mant_RelacionAP import Conexion_AP self.raiz.destroy() Conexion_AP()
class Aplicacion: def __init__(self): self.raiz = Tk() self.raiz.title ("Mantenimiento de Administración") self.raiz.geometry('900x600') menubar = Menu(self.raiz) self.raiz.config(menu=menubar) filemenu = Menu(menubar, tearoff=0) filemenu.add_command(label="Acerca de..") filemenu.add_separator() filemenu.add_command(label="Salir", command=self.raiz.quit) mantmenu = Menu(menubar, tearoff=0) mantmenu.add_command(label="Clientes", command=self.mostrar_mant_telefonos) mantmenu.add_command(label="Servidor") menubar.add_cascade(label="Archivo", menu=filemenu) menubar.add_cascade(label="Mantenimiento", menu=mantmenu) self.fuente = font.Font(weight="bold") self.persona = Persona.Persona() self.insertando = True self.lb_tituloPantalla = Label(self.raiz, text = "MANTENIMIENTO DE ADMINISTRACIÓN", font = self.fuente) self.lb_tituloPantalla.place(x = 320, y = 20) self.lb_cedula = Label(self.raiz, text = "Cedula:") self.lb_cedula.place(x = 240, y = 60) self.txt_cedula = Entry(self.raiz, textvariable=self.persona.cedula, justify="right") self.txt_cedula.place(x = 370, y = 60) self.lb_nombre = Label(self.raiz, text = "Nombre:") self.lb_nombre.place(x = 240, y = 90) self.txt_nombre = Entry(self.raiz, textvariable=self.persona.nombre, justify="right", width=30) self.txt_nombre.place(x = 370, y = 90) self.lb_apellido1 = Label(self.raiz, text = "Primer apellido:") self.lb_apellido1.place(x = 240, y = 120) self.txt_apellido1 = Entry(self.raiz, textvariable=self.persona.apellido1, justify="right", width=30) self.txt_apellido1.place(x = 370, y = 120) self.lb_apellido2 = Label(self.raiz, text = "Segundo apellido:") self.lb_apellido2.place(x = 240, y = 150) self.txt_apellido2 = Entry(self.raiz, textvariable=self.persona.apellido2, justify="right", width=30) self.txt_apellido2.place(x = 370, y = 150) self.lb_fec_nacimiento = Label(self.raiz, text = "Fecha nacimiento:") self.lb_fec_nacimiento.place(x = 240, y = 180) self.txt_fechaNacimiento = Entry(self.raiz, textvariable=self.persona.fecNacimiento, justify="right", width=30, state="readonly") self.txt_fechaNacimiento.place(x = 370, y = 180) self.bt_mostrarCalendario = Button(self.raiz, text="...", width=3, command = self.mostrarDatePicker) self.bt_mostrarCalendario.place(x = 650, y = 180) self.lb_sexo = Label(self.raiz, text = "Sexo:") self.lb_sexo.place(x = 240, y = 210) self.radio_sexoM = Radiobutton(self.raiz, text="Masculino", variable=self.persona.sexo, value=1) self.radio_sexoF = Radiobutton(self.raiz, text="Femenino", variable=self.persona.sexo, value=2) self.radio_sexoM.place(x = 370, y = 210) self.radio_sexoF.place(x = 490, y = 210) self.persona.sexo.set(1) self.lb_observaciones = Label(self.raiz, text = "Observaciones:") self.lb_observaciones.place(x = 240, y = 250) self.txt_observaciones = Entry(self.raiz, textvariable=self.persona.observaciones, justify="right", width=30) self.txt_observaciones.place(x = 370, y = 250) self.bt_borrar = Button(self.raiz, text="Limpiar", width=15, command = self.limpiarInformacion) self.bt_borrar.place(x = 370, y = 310) self.bt_enviar = Button(self.raiz, text="Enviar", width=15, command = self.enviarInformacion) self.bt_enviar.place(x = 510, y = 310) self.bt_modificar = Button(self.raiz, text="Modificar", width=15, command = self.enviarInformacion) self.bt_modificar.place(x = 650, y = 310) self.lb_tituloPantalla = Label(self.raiz, text = "INFORMACIÓN INCLUIDA", font = self.fuente) self.lb_tituloPantalla.place(x = 350, y = 355) self.lb_bloquear=Button(self.raiz,text="Bloquear",width=15,command=self.bloquear) self.lb_bloquear.place(x=650,y=330) self.desbloquear=Button(self.raiz,text="Desbloquear",width=15,command=self.desbloquear) self.lb_desbloquear.place(x=650,y=340) self.lb_iniciar_tiempo=Button(self.raiz,text="Iniciar tiempo",width=15,command=self.iniciar_tiempo) self.lb_iniciar_tiempo.place(x=650,y=350) self.lb_detener_tiempo=Button(self.raiz,text="Detener tiempo",width=15,command=self.detener_tiempo) self.lb_bloquear.place(x=650,y=360) self.lb_enviar_mensaje=Button(self.raiz,text="Enviar",width=15,command=self.enviarInformacion) self.lb_enviar_mensaje.place(x=650,y=370) self.sheet = Sheet(self.raiz, page_up_down_select_row = True, column_width = 120, startup_select = (0,1,"rows"), headers = ['Cédula', 'Nombre', 'Primer Ape.', 'Segundo Ape.', 'Fec. Nacimiento', 'Sexo'], height = 195, width = 720 ) self.sheet.enable_bindings(("single_select", "column_select", "row_select", "column_width_resize", "double_click_column_resize", #"row_width_resize", #"column_height_resize", "arrowkeys", "row_height_resize", "double_click_row_resize", "right_click_popup_menu", "rc_select", "rc_insert_column", "rc_delete_column", "rc_insert_row", "rc_delete_row")) self.sheet.place(x = 20, y = 390) self.bt_cargar = Button(self.raiz, text="Cargar", width=15, command = self.cargarInformacion) self.bt_cargar.place(x = 750, y = 385) self.bt_eliminar = Button(self.raiz, text="Eliminar", width=15, command = self.eliminarInformacion) self.bt_eliminar.place(x = 750, y = 425) self.cargarTodaInformacion() self.raiz.mainloop() def mostrar_mant_telefonos(self): mant_telefonos.MantTelefonos(self.raiz) def cargarTodaInformacion(self): try: self.personaBo = PersonoBO.PersonaBO() resultado = self.personaBo.consultar() self.sheet.set_sheet_data(resultado) except Exception as e: msg.showerror("Error", str(e)) def cargarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() cedula = (self.sheet.get_cell_data(datoSeleccionado[0],0)) self.persona.cedula.set(cedula) self.personaBo = PersonoBO.PersonaBO() self.personaBo.consultarPersona(self.persona) self.insertando = False msg.showinfo("Acción: Consultar persona", "La información de la persona ha sido consultada correctamente") except Exception as e: msg.showerror("Error", str(e)) def eliminarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() cedula = (self.sheet.get_cell_data(datoSeleccionado[0],0)) nombre = (self.sheet.get_cell_data(datoSeleccionado[0],1)) resultado = msg.askquestion("Eliminar", "¿Desear eliminar a "+nombre+" de la base de datos?") if resultado == "yes": self.persona.cedula.set(cedula) self.personaBo = PersonoBO.PersonaBO() self.personaBo.eliminar(self.persona) self.cargarTodaInformacion() self.persona.limpiar() except Exception as e: msg.showerror("Error", str(e)) def printTxt(self, texto): print(texto) def enviarInformacion(self): try: self.personaBo = PersonoBO.PersonaBO() if(self.insertando == True): self.personaBo.guardar(self.persona) else: self.personaBo.modificar(self.persona) self.cargarTodaInformacion() self.persona.limpiar() if(self.insertando == True): msg.showinfo("Acción: Agregar persona", "La información de la persona ha sido incluida correctamente") else: msg.showinfo("Acción: Agregar modificar", "La información de la persona ha sido modificada correctamente") self.insertando = True except Exception as e: msg.showerror("Error", str(e)) def limpiarInformacion(self): self.persona.limpiar() self.insertando = True msg.showinfo("Acción del sistema", "La información del formulario ha sido eliminada correctamente") def mostrarDatePicker(self): self.top = Toplevel(self.raiz) self.cal = Calendar(self.top, font="Arial 14", selectmode='day', locale='en_US', cursor="hand", year=2019, month=6, day=16) self.cal.pack(fill="both", expand=True) ttk.Button(self.top, text="Seleccionar", command = self.seleccionarFecha).pack() def seleccionarFecha(self): self.persona.fecNacimiento.set(self.cal.selection_get())
class EmailTab(tk.Frame): def __init__(self, master): self.emailHandler = EmailSheetHandler(FILENAME) tk.Frame.__init__(self, master) self.grid_columnconfigure(0, weight = 1) self.grid_rowconfigure(0, weight = 1) self.frame = ttk.Frame(self, height=450, width=400) self.frame.grid_columnconfigure(0, weight = 1) self.frame.grid_rowconfigure(0, weight = 1) self.sheet = Sheet(self.frame, page_up_down_select_row = True, #empty_vertical = 0, column_width = 300, startup_select = (0,1,"rows"), data=self.populate_sheet(), total_columns = 3, #if you want to set empty sheet dimensions at startup height = 450, #height and width arguments are optional width = 600 #For full startup arguments see DOCUMENTATION.md ) self.sheet.enable_bindings(("single_select", #"single_select" or "toggle_select" "drag_select", #enables shift click selection as well "column_drag_and_drop", "row_drag_and_drop", "column_select", "row_select", "column_width_resize", "double_click_column_resize", "arrowkeys", "row_height_resize", "double_click_row_resize", "right_click_popup_menu", "rc_select", "edit_cell")) self.sheet.extra_bindings("end_edit_cell", self.end_edit_cell) self.frame.grid(row = 0, column = 0, sticky = "nsw") self.sheet.grid(row = 0, column = 0, sticky = "nw") self.email_button_frame = ttk.Frame(self.frame, padding=(3,3,12,12), borderwidth=5, width=100, heigh=200) self.email_add_button = tk.Button(self.email_button_frame, text="Add email", command=self.add_email) self.email_merge_button = tk.Button(self.email_button_frame, text="Merge email (with file)", command=self.merge_mails) self.email_update_button = tk.Button(self.email_button_frame, text="Update file with table", command=self.email_file_update ) self.email_button_frame.grid(row=0, column=2, sticky="nswe") self.email_add_button.grid(row=1, column=1) self.email_merge_button.grid(row=2, column=1) self.email_update_button.grid(row=3, column=1) # print(self.sheet.get_sheet_data(get_index=0, get_header=0)) def end_edit_cell(self, event): print(event) print(self.sheet.get_cell_data(event[0], event[1 ])) def add_email(self): package = [] AddDialogue(package, "Add Email", "Add Email") print("Rsult: ", package) self.emailHandler.append_to_file(package) self.update_table() def email_file_update(self): self.emailHandler.update_email_file(self.sheet.get_sheet_data()) def update_table(self): data = self.populate_sheet() self.sheet.set_sheet_data(data) def merge_mails(self): file = filedialog.askopenfile().name print(file) # TODO: handle merge print(self.emailHandler.validate(file)) def populate_sheet(self): self.data = [] try: with open(FILENAME, 'r') as f: L = f.readlines() self.data = [i.strip("\n").split(",") for i in L] # for i in self.data: i.append("50") return self.data except FileNotFoundError: return self.data
class MantTelefono(): def __init__(self, parent): self.parent = parent self.raiz = Toplevel(self.parent) self.raiz.title("Mantenimiento de Telefonos") self.raiz.geometry('900x510') menubar = Menu(self.raiz) self.raiz.config(menu=menubar) filemenu = Menu(menubar, tearoff=0) filemenu.add_command(label="Acerca de..") filemenu.add_separator() filemenu.add_command(label="Salir", command=self.raiz.quit) mantmenu = Menu(menubar, tearoff=0) mantmenu.add_command(label="Personas", command=self.mostrar_mant_personas) mantmenu.add_command(label="Direcciones") menubar.add_cascade(label="Archivo", menu=filemenu) menubar.add_cascade(label="Mantenimiento", menu=mantmenu) self.fuente = font.Font(weight="bold") self.telefono = Telefono.Telefono() self.insertando = True self.nombreCliente = StringVar() self.Cliente = Cliente.Cliente() self.lb_tituloPantalla = Label(self.raiz, text="MANTENIMIENTO DE TELEFONOS", font=self.fuente) self.lb_tituloPantalla.place(x=320, y=20) self.lb_cedula = Label(self.raiz, text="Cedula:") self.lb_cedula.place(x=240, y=60) self.txt_cedula = Entry(self.raiz, textvariable=self.telefono.cedula, justify="right", width=12) self.txt_cedula.place(x=370, y=60) self.bt_consultar = Button(self.raiz, text="Consultar", width=15, command=self.consultarNombre) self.bt_consultar.place(x=512, y=60) self.lb_nombre = Label(self.raiz, text="Nombre:") self.lb_nombre.place(x=240, y=90) self.txt_nombre = Entry(self.raiz, textvariable=self.nombrePersona, justify="right", width=30) self.txt_nombre.place(x=370, y=90) self.lb_telefono = Label(self.raiz, text="Telefono:") self.lb_telefono.place(x=240, y=120) self.txt_telefono = Entry(self.raiz, textvariable=self.telefono.telefono, justify="right", width=30) self.txt_telefono.place(x=370, y=120) self.lb_descripcion = Label(self.raiz, text="Descripción:") self.lb_descripcion.place(x=240, y=150) self.txt_descripcion = Entry(self.raiz, textvariable=self.telefono.descripcion, justify="right", width=30) self.txt_descripcion.place(x=370, y=150) self.bt_borrar = Button(self.raiz, text="Limpiar", width=15, command=self.limpiarInformacion) self.bt_borrar.place(x=370, y=180) self.bt_enviar = Button(self.raiz, text="Enviar", width=15, command=self.enviarInformacion) self.bt_enviar.place(x=510, y=180) self.lb_tituloPantalla = Label(self.raiz, text="INFORMACIÓN INCLUIDA", font=self.fuente) self.lb_tituloPantalla.place(x=350, y=230) self.sheet = Sheet( self.raiz, page_up_down_select_row=True, column_width=120, startup_select=(0, 1, "rows"), headers=['Cédula', 'Nombre', 'Telefono', 'Descripción'], height=195, width=720) self.sheet.enable_bindings( ("single_select", "column_select", "row_select", "column_width_resize", "double_click_column_resize", "arrowkeys", "row_height_resize", "double_click_row_resize", "right_click_popup_menu", "rc_select", "rc_insert_column", "rc_delete_column", "rc_insert_row", "rc_delete_row")) self.sheet.place(x=20, y=260) self.bt_cargar = Button(self.raiz, text="Cargar", width=15, command=self.cargarInformacion) self.bt_cargar.place(x=750, y=255) self.bt_eliminar = Button(self.raiz, text="Eliminar", width=15, command=self.eliminarInformacion) self.bt_eliminar.place(x=750, y=295) self.cargarTodaInformacion() self.parent.withdraw() self.raiz.protocol("WM_DELETE_WINDOW", self.on_closing) def enviarInformacion(self): try: self.telefonoBo = TelefonoBO.TelefonoBO() if (self.insertando == True): self.telefonoBo.guardar(self.telefono) else: self.telefonoBo.modificar(self.telefono) self.cargarTodaInformacion() self.telefono.limpiar() self.nombreCliente.set("") if (self.insertando == True): msg.showinfo( "Acción: Agregar teléfono", "La información del teléfono ha sido incluida correctamente" ) else: msg.showinfo( "Acción: Modificar teléfono", "La información del teléfono ha sido modificada correctamente" ) self.insertando = True except Exception as e: msg.showerror("Error", str(e)) def limpiarInformacion(self): self.telefono.limpiar() self.nombreCliente.set("") self.insertando = True msg.showinfo( "Acción del sistema", "La información del formulario ha sido eliminada correctamente") def consultarNombre(self): try: self.ClienteBo = PersonoBO.ClienteBO() self.Cliente.cedula.set(self.telefono.cedula.get()) self.ClienteBo.consultarCliente(self.Cliente) if self.Cliente.nombre.get() == "": self.nombreCliente = "No existe el Cliente " else: self.nombreCliente.set(self.Cliente.nombre.get() + " " + self.Cliente.apellido1.get() + " " + self.Cliente.apellido2.get()) except Exception as e: msg.showerror("Error", str(e)) def cargarTodaInformacion(self): try: self.telefonoBo = TelefonoBO.TelefonoBO() resultado = self.telefonoBo.consultar() self.sheet.set_sheet_data(resultado) except Exception as e: msg.showerror("Error", str(e)) def cargarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() telefono = (self.sheet.get_cell_data(datoSeleccionado[0], 2)) self.telefono.telefono.set(telefono) self.telefonoBo = TelefonoBO.TelefonoBO() self.telefonoBo.consultarTelefono(self.telefono) self.consultarNombre() self.insertando = False msg.showinfo( "Acción: Consultar teléfono", "La información del teléfono ha sido consultada correctamente") except Exception as e: msg.showerror("Error", str(e)) def eliminarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() telefono = (self.sheet.get_cell_data(datoSeleccionado[0], 2)) nombre = (self.sheet.get_cell_data(datoSeleccionado[0], 1)) resultado = msg.askquestion( "Eliminar", "¿Desear eliminar el telefono " + telefono + " de " + nombre + " de la base de datos?") if resultado == "yes": self.telefono.telefono.set(telefono) self.telefonoBo = TelefonoBO.TelefonoBO() self.telefonoBo.eliminar(self.telefono) self.cargarTodaInformacion() self.telefono.limpiar() self.nombreCliente.set("") except Exception as e: msg.showerror("Error", str(e)) def mostrar_mant_cliente(self): self.parent.deiconify() self.raiz.destroy() def on_closing(self): self.parent.destroy()
class AnalyzeStockScreen(Frame): def __init__(self, master=None, session=None): super().__init__(master) self.master = master self.session = session self.analyze_controller = FAnalyzeStockController(session) self.pack(padx=20, pady=20) self.create_widgets() def create_widgets(self): # Khởi tạo tab phân tích chứng khoán ## Phần nhập ngày bắt đầu self.start_date_frame = Frame(self) self.start_date_frame.pack(fill=X) self.start_date_label = Label(self.start_date_frame, text="Start date", width=10) self.start_date_label.pack(side=LEFT, padx=5, pady=5) self.start_date_input = Entry(self.start_date_frame) self.start_date_input.pack(fill=X, padx=5, expand=True) ## Phần nhập ngày kết thúc self.end_date_frame = Frame(self) self.end_date_frame.pack(fill=X) self.end_date_label = Label(self.end_date_frame, text="End date", width=10) self.end_date_label.pack(side=LEFT, padx=5, pady=5) self.end_date_input = Entry(self.end_date_frame) self.end_date_input.pack(fill=X, padx=5, expand=True) ## Phần nút bấm self.stock_submit_frame = Frame(self) self.stock_submit_frame.pack(fill=X, padx=10) ## Phần button phân tích self.stock_submit = Button(self.stock_submit_frame) self.stock_submit["text"] = "Tính" self.stock_submit["command"] = lambda: self.start_calc() self.stock_submit.pack(side=RIGHT) # Phầns button export excel self.export_excel_button = Button(self.stock_submit_frame, state=DISABLED) self.export_excel_button["text"] = "Export file" self.export_excel_button["command"] = lambda: self.export_file_excel() self.export_excel_button.pack(side=RIGHT, padx=20) ## Phần bản tính self.tabel_frame = Frame(self) self.tabel_frame.pack(fill=X, pady=10) self.sheet = Sheet(self.tabel_frame) self.sheet.pack(fill=X) self.header = ("Mã", "Giá đóng nhỏ nhất", "Giá đóng lớn nhất") self.sheet.headers(self.header) ### Cấu hình cho tkinter sheet self.sheet.enable_bindings( ("single_select", "row_select", "column_width_resize", "arrowkeys", "right_click_popup_menu", "rc_select", "rc_insert_row", "rc_delete_row", "copy", "cut", "paste", "delete", "undo", "edit_cell")) def start_calc(self): ## Disable trang export file button self.export_excel_button["state"] = DISABLED datetime_format = "%d/%m/%Y" startDate = datetime.strptime(self.start_date_input.get().strip(), datetime_format) endDate = datetime.strptime(self.end_date_input.get(), datetime_format) self.analyzeStocks = self.analyze_controller.get_analyze_stocks_data( startDate, endDate) ## Tạo data cho tkinter sheet self.data_sheet = [] for anaStock in self.analyzeStocks: self.data_sheet.append([ anaStock.code, anaStock.closedPriceMin, anaStock.closedPriceMax ]) ## Thêm vào tkinter sheet self.sheet.set_sheet_data(self.data_sheet) self.export_excel_button["state"] = NORMAL def export_file_excel(self): ## Tạo bảnh tính excel với tên file là file_excel_<Thời gian tính theo giây> workbook = xlsxwriter.Workbook('file_excel_{}.xlsx'.format( time.time())) worksheet = workbook.add_worksheet() ## Tạo kiểu kiểu chữ bold = workbook.add_format({'bold': True}) ## Phần header cho trang tính excel worksheet.write('A1', 'Mã', bold) worksheet.write('B1', 'Giá đóng nhỏ nhất', bold) worksheet.write('C1', 'Giá đóng lớn nhất', bold) ## Thêm dòng vào bảng tính row = 1 for record in self.analyzeStocks: worksheet.write(row, 0, record.code) worksheet.write(row, 1, record.closedPriceMin) worksheet.write(row, 2, record.closedPriceMax) row += 1 ## Lưu file và đóng bảng tính workbook.close()
class Directorio_C: def __init__(self): #Pantalla self.raiz = Tk() self.raiz.title("Mantenimiento de Clientes") self.raiz.geometry('600x630') #Barra menu menubar = Menu(self.raiz) self.raiz.config(menu=menubar) filemenu = Menu(menubar, tearoff=0) filemenu.add_command(label="Salir", command=self.raiz.quit) mantmenu = Menu(menubar, tearoff=0) mantmenu.add_command(label="Facturas", command=self.abrir_F) mantmenu.add_command(label="Articulos", command=self.abrir_A) mantmenu.add_command(label="Proveedores", command=self.abrir_p) mantmenu.add_command(label="Conexion", command=self.abrir_R) menubar.add_cascade(label="Archivo", menu=filemenu) menubar.add_cascade(label="Mantenimiento", menu=mantmenu) #Objecto cliente self.fuente = font.Font(weight="bold") self.cliente = Cliente.Cliente() self.insertando = True #Titulo self.lb_tituloPantalla = Label(self.raiz, text="MANTENIMIENTO DE CLIENTES", font=self.fuente) self.lb_tituloPantalla.place(x=180, y=20) #Formulario #Cedula self.lb_cedula = Label(self.raiz, text="Cedula:") self.lb_cedula.place(x=100, y=60) self.txt_cedula = Entry(self.raiz, textvariable=self.cliente.PK_CEDULA, justify="right") self.txt_cedula.place(x=230, y=60) #Nombre self.lb_nombre = Label(self.raiz, text="Nombre:") self.lb_nombre.place(x=100, y=90) self.txt_nombre = Entry(self.raiz, textvariable=self.cliente.NOMBRE_C, justify="right", width=30) self.txt_nombre.place(x=230, y=90) #Apellido 1 self.lb_apellido1 = Label(self.raiz, text="Primer apellido:") self.lb_apellido1.place(x=100, y=120) self.txt_apellido1 = Entry(self.raiz, textvariable=self.cliente.APELLIDO_1, justify="right", width=30) self.txt_apellido1.place(x=230, y=120) #Apellido 2 self.lb_apellido2 = Label(self.raiz, text="Segundo apellido:") self.lb_apellido2.place(x=100, y=150) self.txt_apellido2 = Entry(self.raiz, textvariable=self.cliente.APELLIDO_2, justify="right", width=30) self.txt_apellido2.place(x=230, y=150) #Fecha nacimiento self.lb_fec_nacimiento = Label(self.raiz, text="Fecha nacimiento:") self.lb_fec_nacimiento.place(x=100, y=180) self.txt_fechaNacimiento = Entry( self.raiz, textvariable=self.cliente.FECHA_NACIMIENTO, justify="right", width=30, state="readonly") self.txt_fechaNacimiento.place(x=230, y=180) self.bt_mostrarCalendario = Button(self.raiz, text="...", width=3, command=self.mostrarDatePicker) self.bt_mostrarCalendario.place(x=510, y=180) #Direccion self.lb_direccion = Label(self.raiz, text="Direccion:") self.lb_direccion.place(x=100, y=210) self.txt_direccion = Entry(self.raiz, textvariable=self.cliente.DIRECCION, justify="right", width=30) self.txt_direccion.place(x=230, y=210) #Observaciones self.lb_observaciones = Label(self.raiz, text="Observaciones:") self.lb_observaciones.place(x=100, y=240) self.txt_observaciones = Entry(self.raiz, textvariable=self.cliente.OBSERVACIONES, justify="right", width=30) self.txt_observaciones.place(x=230, y=240) #Telefono 1 self.lb_telefono_1 = Label(self.raiz, text="Telefono Principal:") self.lb_telefono_1.place(x=100, y=270) self.txt_telefono_1 = Entry(self.raiz, textvariable=self.cliente.TELEFONO_1, justify="right", width=30) self.txt_telefono_1.place(x=230, y=270) #Telefono 2 self.lb_telefono_2 = Label(self.raiz, text="Telefono segundario:") self.lb_telefono_2.place(x=100, y=300) self.txt_telefono_2 = Entry(self.raiz, textvariable=self.cliente.TELEFONO_2, justify="right", width=30) self.txt_telefono_2.place(x=230, y=300) #Boton Limpiar self.bt_borrar = Button(self.raiz, text="Limpiar", width=15, command=self.limpiarInformacion) self.bt_borrar.place(x=70, y=340) #Boton Enviar self.bt_enviar = Button(self.raiz, text="Enviar", width=15, command=self.enviarInformacion) self.bt_enviar.place(x=190, y=340) #Boton Cargar self.bt_borrar = Button(self.raiz, text="Cargar", width=15, command=self.cargarInformacion) self.bt_borrar.place(x=310, y=340) #Boton Eliminar self.bt_enviar = Button(self.raiz, text="Eliminar", width=15, command=self.eliminarInformacion) self.bt_enviar.place(x=430, y=340) self.bt_reporte = Button(self.raiz, text="Reporte", width=15, command=self.generarPDFListado) self.bt_reporte.place(x=550, y=340) #label del informacion self.lb_tituloPantalla = Label(self.raiz, text="INFORMACIÓN INCLUIDA", font=self.fuente) self.lb_tituloPantalla.place(x=190, y=400) #cuadro excel self.sheet = Sheet(self.raiz, page_up_down_select_row=True, column_width=120, startup_select=(0, 1, "rows"), headers=[ 'Cédula', 'Nombre', 'Primer Ape.', 'Segundo Ape.', 'Fec. Nacimiento', 'Direccion', 'Observaciones', 'Telefono 1', 'Telefono 2' ], height=170, width=560) self.sheet.enable_bindings( ("single_select", "column_select", "row_select", "column_width_resize", "double_click_column_resize", "arrowkeys", "row_height_resize", "double_click_row_resize", "right_click_popup_menu", "rc_select", "rc_insert_column", "rc_delete_column", "rc_insert_row", "rc_delete_row")) self.sheet.place(x=20, y=440) #toda informacion self.cargarTodaInformacion() #cierre de raiz self.raiz.mainloop() def generarPDFListado(self): try: #Crea un objeto para la creación del PDF nombreArchivo = "ListadoPersonas.pdf" rep = reportPDF.Canvas(nombreArchivo) #Agrega el tipo de fuente Arial registerFont(TTFont('Arial', 'ARIAL.ttf')) #Crea el texto en donde se incluye la información textobject = rep.beginText() # Coloca el titulo textobject.setFont('Arial', 16) textobject.setTextOrigin(10, 800) textobject.setFillColor(colors.darkorange) textobject.textLine(text='LISTA DE CLIENTES') #Escribe el titulo en el reportes rep.drawText(textobject) #consultar la informacion de la base de datos self.clienteBo = ClienteBO.ClienteBO( ) #se crea un objeto de logica de negocio informacion = self.clienteBo.consultar() #agrega los titulos de la tabla en la información consultada titulos = [ "Cédula", "Nombre", "Primer Ape.", "Segundo Ape.", "Fec. Nacimiento", "Direccion", "Observaciones", "Telefono 1", "Telefono 2" ] informacion.insert(0, titulos) #crea el objeto tabla para mostrar la información t = Table(informacion) #Le coloca el color tanto al borde de la tabla como de las celdas t.setStyle( TableStyle([("BOX", (0, 0), (-1, -1), 0.25, colors.black), ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black) ])) #para cambiar el color de las fichas de hace un ciclo según la cantidad de datos #que devuelve la base de datos data_len = len(informacion) for each in range(data_len): if each % 2 == 0: bg_color = colors.whitesmoke else: bg_color = colors.lightgrey if each == 0: #Le aplica un estilo diferente a la tabla t.setStyle( TableStyle([('BACKGROUND', (0, each), (-1, each), colors.orange)])) else: t.setStyle( TableStyle([('BACKGROUND', (0, each), (-1, each), bg_color)])) #acomoda la tabla según el espacio requerido aW = 840 aH = 780 w, h = t.wrap(aW, aH) t.drawOn(rep, 10, aH - h) #Guarda el archivo rep.save() #Abre el archivo desde comandos, puede variar en MacOs es open #subprocess.Popen("open '%s'" % nombreArchivo, shell=True) subprocess.Popen(nombreArchivo, shell=True) #Windows except IOError: msg.showerror("Error", "El archivo ya se encuentra abierto") #calendario def mostrarDatePicker(self): #ventana segundaria self.top = Toplevel(self.raiz) self.cal = Calendar(self.top, font="Arial 14", selectmode='day', locale='en_US', cursor="hand1", year=2019, month=6, day=16) self.cal.pack(fill="both", expand=True) ttk.Button(self.top, text="Seleccionar", command=self.seleccionarFecha).pack() #Selecciona la fecha def seleccionarFecha(self): self.cliente.FECHA_NACIMIENTO.set(self.cal.selection_get()) self.top.destroy() #Limpiar def limpiarInformacion(self): self.cliente.limpiar() msg.showinfo( "Acción del sistema", "La información del formulario ha sido eliminada correctamente") #envia la info def enviarInformacion(self): try: self.clienteBo = ClienteBO.ClienteBO() if (self.insertando == True): self.clienteBo.guardar(self.cliente) else: self.clienteBo.modificar(self.cliente) self.cargarTodaInformacion() self.insertando = True self.cliente.limpiar() if (self.insertando == True): msg.showinfo( "Acción: Agregar cliente", "La información del cliente ha sido incluida correctamente" ) else: msg.showinfo( "Acción: modificar cliente", "La información del cliente ha sido modificada correctamente" ) except Exception as e: msg.showerror("Error", str(e)) #eliminar la info def eliminarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() cedula = (self.sheet.get_cell_data(datoSeleccionado[0], 0)) nombre = (self.sheet.get_cell_data(datoSeleccionado[0], 1)) resultado = msg.askquestion( "Eliminar", "¿Desear eliminar a " + nombre + " de la base de datos?") if resultado == "yes": self.cliente.PK_CEDULA.set(cedula) self.clienteBo = ClienteBO.ClienteBO() self.clienteBo.eliminar(self.cliente) self.cliente.limpiar() except Exception as e: msg.showerror("Error", str(e)) self.cargarTodaInformacion( ) #refrescar la pagina especialmente para llaves foraneas relacionales #cargar toda la info def cargarTodaInformacion(self): try: self.clienteBo = ClienteBO.ClienteBO() resultado = self.clienteBo.consultar() self.sheet.set_sheet_data(resultado) except Exception as e: msg.showerror("Error", str(e)) #selecionado def cargarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() cedula = (self.sheet.get_cell_data(datoSeleccionado[0], 0)) self.cliente.PK_CEDULA.set(cedula) self.clienteBo = ClienteBO.ClienteBO() self.clienteBo.consultarCliente(self.cliente) self.insertando = False msg.showinfo( "Acción: Consultar cliente", "La información del cliente ha sido consultada correctamente") except Exception as e: msg.showerror("Error", str(e)) #abrir def abrir_F(self): from mant_Factura import Directorio_F self.raiz.destroy() Directorio_F() def abrir_A(self): from mant_Articulos import Directorio_A self.raiz.destroy() Directorio_A() def abrir_p(self): from mant_Proveedor import Directorio_P self.raiz.destroy() Directorio_P() def abrir_R(self): from mant_RelacionAP import Conexion_AP self.raiz.destroy() Conexion_AP()
class TableLastOut(): def __init__(self): text_customer_latest = Label( root, text="List Pelanggan Urut Terakhir Keluar", font="ROBOTO 13") text_customer_latest.grid(row=8, column=0, columnspan=2, padx=5, pady=(80, 10)) self.frame = tableFrameLatest self.frame.grid_columnconfigure(0, weight=1) self.frame.grid_rowconfigure(0, weight=1) self.sheet = Sheet( self.frame, page_up_down_select_row=True, # empty_vertical = 0, column_width=120, startup_select=(0, 1, "rows"), # row_height = "4", # default_row_index = "numbers", # default_header = "both", # empty_horizontal = 0, # show_vertical_grid = False, # show_horizontal_grid = False, # auto_resize_default_row_index = False, # header_height = "3", # row_index_width = 100, # align = "e", # header_align = "w", # row_index_align = "w", data=sorted(list_last_out, key=lambda x: x[2], reverse=TRUE), # to set sheet data at startup headers=["No Plat Polisi", "Masuk", "Keluar", "Biaya"], # set_all_heights_and_widths = True, #to fit all cell sizes to text at start up # headers = 0, #to set headers as first row at startup # headers = [f"Column {c}\nnewline1\nnewline2" for c in range(30)], # theme = "light green", # row_index = 0, #to set row_index as first column at startup # total_rows = 2000, #if you want to set empty sheet dimensions at startup # total_columns = 30, #if you want to set empty sheet dimensions at startup height=200, # height and width arguments are optional width=500 # For full startup arguments see DOCUMENTATION.md ) # self.sheet.hide("row_index") # self.sheet.hide("header") # self.sheet.hide("top_left") self.sheet.enable_bindings(( "single_select", # "single_select" or "toggle_select" "drag_select", # enables shift click selection as well "column_drag_and_drop", "row_drag_and_drop", "column_select", "row_select", "column_width_resize", "double_click_column_resize", # "row_width_resize", # "column_height_resize", "arrowkeys", "row_height_resize", "double_click_row_resize", "right_click_popup_menu", "rc_select", "rc_insert_column", "rc_delete_column", "rc_insert_row", "rc_delete_row", "hide_columns", "copy", "cut", "paste", "delete", "undo", "edit_cell")) # self.sheet.disable_bindings() #uses the same strings # self.sheet.enable_bindings() self.frame.grid(row=9, column=0, columnspan=2, sticky="nswe", padx=5) self.sheet.grid(row=9, column=0, columnspan=2, sticky="nswe", padx=5) def set_data(self): self.sheet.set_sheet_data( sorted(list_last_out, key=lambda x: x[2], reverse=TRUE))
class Directorio_A: def __init__(self): #Pantalla self.raiz = Tk() self.raiz.title("Mantenimiento de Articulos") self.raiz.geometry('680x520') #Barra menu menubar = Menu(self.raiz) self.raiz.config(menu=menubar) filemenu = Menu(menubar, tearoff=0) filemenu.add_command(label="Salir", command=self.raiz.quit) mantmenu = Menu(menubar, tearoff=0) mantmenu.add_command(label="Proveedor", command=self.abrir_P) mantmenu.add_command(label="Clientes", command=self.abrir_C) mantmenu.add_command(label="Facturas", command=self.abrir_F) mantmenu.add_command(label="Conexion", command=self.abrir_R) menubar.add_cascade(label="Archivo", menu=filemenu) menubar.add_cascade(label="Mantenimiento", menu=mantmenu) #Objecto Articulo self.fuente = font.Font(weight="bold") self.articulo = Articulos.Articulo() self.insertando = True #Titulo self.lb_tituloPantalla = Label(self.raiz, text="MANTENIMIENTO DE ARTICULOS", font=self.fuente) self.lb_tituloPantalla.place(x=180, y=20) #Formulario #ID articulo self.lb_cedula = Label(self.raiz, text="ID articulo:") self.lb_cedula.place(x=100, y=60) self.txt_cedula = Entry(self.raiz, textvariable=self.articulo.PK_ID_ART, justify="right") self.txt_cedula.place(x=230, y=60) #Nombre self.lb_nombre = Label(self.raiz, text="nombre del articulo:") self.lb_nombre.place(x=100, y=90) self.txt_nombre = Entry(self.raiz, textvariable=self.articulo.NOMBRE, justify="right", width=30) self.txt_nombre.place(x=230, y=90) #Cantidad existente self.lb_apellido1 = Label(self.raiz, text="Cantidad existente:") self.lb_apellido1.place(x=100, y=120) self.txt_apellido1 = Entry(self.raiz, textvariable=self.articulo.CANT_EXI, justify="right") self.txt_apellido1.place(x=230, y=120) #descripcion self.lb_apellido2 = Label(self.raiz, text="Descripcion:") self.lb_apellido2.place(x=100, y=150) self.txt_apellido2 = Entry(self.raiz, textvariable=self.articulo.DESCRIPCION, justify="right", width=30) self.txt_apellido2.place(x=230, y=150) #Precio unitario self.lb_apellido1 = Label(self.raiz, text="Precio unitario:") self.lb_apellido1.place(x=100, y=180) self.txt_apellido1 = Entry(self.raiz, textvariable=self.articulo.PRECIO_UN, justify="right") self.txt_apellido1.place(x=230, y=180) #Boton Limpiar self.bt_borrar = Button(self.raiz, text="Limpiar", width=15) self.bt_borrar.place(x=70, y=220) #Boton Enviar self.bt_enviar = Button(self.raiz, text="Enviar", width=15, command=self.enviarInformacion) self.bt_enviar.place(x=190, y=220) #Boton Cargar self.bt_borrar = Button(self.raiz, text="Cargar", width=15, command=self.cargarInformacion) self.bt_borrar.place(x=310, y=220) #Boton Eliminar self.bt_enviar = Button(self.raiz, text="Eliminar", width=15, command=self.eliminarInformacion) self.bt_enviar.place(x=430, y=220) self.bt_reporte = Button(self.raiz, text="Reporte", width=15, command=self.generarPDFListado) self.bt_reporte.place(x=550, y=340) #Se coloca un label del informacion self.lb_tituloPantalla = Label(self.raiz, text="INFORMACIÓN INCLUIDA", font=self.fuente) self.lb_tituloPantalla.place(x=190, y=275) self.sheet = Sheet(self.raiz, page_up_down_select_row=True, column_width=120, startup_select=(0, 1, "rows"), headers=[ 'ID articulo', 'Nombre', 'Cantidad', 'Descripcion', 'Preio Unitario' ], height=170, width=560) #hoja excel self.sheet.enable_bindings( ("single_select", "column_select", "row_select", "column_width_resize", "double_click_column_resize", "arrowkeys", "row_height_resize", "double_click_row_resize", "right_click_popup_menu", "rc_select", "rc_insert_column", "rc_delete_column", "rc_insert_row", "rc_delete_row")) self.sheet.place(x=20, y=310) #toda informacion self.cargarTodaInformacion() self.raiz.mainloop() def generarPDFListado(self): try: #Crea un objeto para la creación del PDF nombreArchivo = "ListadoArticulos.pdf" rep = reportPDF.Canvas(nombreArchivo) #Agrega el tipo de fuente Arial registerFont(TTFont('Arial', 'ARIAL.ttf')) #Crea el texto en donde se incluye la información textobject = rep.beginText() # Coloca el titulo textobject.setFont('Arial', 16) textobject.setTextOrigin(10, 800) textobject.setFillColor(colors.darkorange) textobject.textLine(text='LISTA DE ARTICULOS') #Escribe el titulo en el reportes rep.drawText(textobject) #consultar la informacion de la base de datos self.articuloBo = ArticuloBO.ArticuloBO( ) #se crea un objeto de logica de negocio informacion = self.articuloBo.consultar() #agrega los titulos de la tabla en la información consultada titulos = [ "ID articulo", "Nombre del articulo", "Descripcion", "Cant.Existente", "Precio Unitario" ] informacion.insert(0, titulos) #crea el objeto tabla para mostrar la información t = Table(informacion) #Le coloca el color tanto al borde de la tabla como de las celdas t.setStyle( TableStyle([("BOX", (0, 0), (-1, -1), 0.25, colors.black), ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black) ])) #para cambiar el color de las fichas de hace un ciclo según la cantidad de datos #que devuelve la base de datos data_len = len(informacion) for each in range(data_len): if each % 2 == 0: bg_color = colors.whitesmoke else: bg_color = colors.lightgrey if each == 0: #Le aplica un estilo diferente a la tabla t.setStyle( TableStyle([('BACKGROUND', (0, each), (-1, each), colors.orange)])) else: t.setStyle( TableStyle([('BACKGROUND', (0, each), (-1, each), bg_color)])) #acomoda la tabla según el espacio requerido aW = 840 aH = 780 w, h = t.wrap(aW, aH) t.drawOn(rep, 10, aH - h) #Guarda el archivo rep.save() #Abre el archivo desde comandos, puede variar en MacOs es open #subprocess.Popen("open '%s'" % nombreArchivo, shell=True) subprocess.Popen(nombreArchivo, shell=True) #Windows except IOError: msg.showerror("Error", "El archivo ya se encuentra abierto") #Limpiar def limpiarInformacion(self): self.articulo.limpiar() msg.showinfo( "Acción del sistema", "La información del formulario ha sido eliminada correctamente") #envia la info def enviarInformacion(self): try: self.articuloBo = ArticuloBO.ArticuloBO() if (self.insertando == True): self.articuloBo.guardar(self.articulo) else: self.articuloBo.modificar(self.articulo) self.cargarTodaInformacion() self.insertando = True self.articulo.limpiar() if (self.insertando == True): msg.showinfo( "Acción: Agregar articulo", "La información del articulo ha sido incluida correctamente" ) else: msg.showinfo( "Acción: modificar articulo", "La información del articulo ha sido modificada correctamente" ) except Exception as e: msg.showerror("Error", str(e)) #eliminar la info def eliminarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() idarticulo = (self.sheet.get_cell_data(datoSeleccionado[0], 0)) nombre = (self.sheet.get_cell_data(datoSeleccionado[0], 1)) resultado = msg.askquestion( "Eliminar", "¿Desear eliminar a " + nombre + " de la base de datos?") if resultado == "yes": self.articulo.PK_ID_ART.set(idarticulo) self.articuloBo = ArticuloBO.ArticuloBO() self.articuloBo.eliminar(self.articulo) self.cargarTodaInformacion() self.articulo.limpiar() except Exception as e: msg.showerror("Error", str(e)) #cargar toda la info def cargarTodaInformacion(self): try: self.articuloBo = ArticuloBO.ArticuloBO() resultado = self.articuloBo.consultar() self.sheet.set_sheet_data(resultado) except Exception as e: msg.showerror("Error", str(e)) #selecionado def cargarInformacion(self): try: datoSeleccionado = self.sheet.get_currently_selected() idarticulo = (self.sheet.get_cell_data(datoSeleccionado[0], 0)) self.articulo.PK_ID_ART.set(idarticulo) self.articuloBo = ArticuloBO.ArticuloBO() self.articuloBo.consultarArticulo(self.articulo) self.insertando = False msg.showinfo( "Acción: Consultar proveedor", "La información del proveedor ha sido consultada correctamente" ) except Exception as e: msg.showerror("Error", str(e)) #abrir def abrir_P(self): from mant_Proveedor import Directorio_P self.raiz.destroy() Directorio_P() def abrir_C(self): from mant_Clientes import Directorio_C self.raiz.destroy() Directorio_C() def abrir_F(self): from mant_Factura import Directorio_F self.raiz.destroy() Directorio_F() def abrir_R(self): from mant_RelacionAP import Conexion_AP self.raiz.destroy() Conexion_AP() self.raiz.mainloop()
class columnselection(tk.Frame): def __init__(self,parent,C): tk.Frame.__init__(self,parent) self.C = C self.parent_cols = [] self.rowlen = 0 self.grid_rowconfigure(0,weight=1) self.grid_rowconfigure(1,weight=1) self.grid_columnconfigure(1,weight=1) self.flattened_choices = flattened_base_ids_choices(self,command=self.flattened_mode_toggle) self.flattened_choices.grid(row=1,column=0,pady=(0,5),sticky="wnse") self.flattened_selector = flattened_column_selector(self) self.selector = id_and_parent_column_selector(self) self.selector.grid(row=1,column=0,sticky="wnse") self.sheetdisplay = Sheet(self, theme = self.C.theme, header_font = ("Calibri", 13, "normal"), outline_thickness=1) self.sheetdisplay.enable_bindings("enable_all") self.sheetdisplay.extra_bindings([("row_index_drag_drop", self.drag_row), ("column_header_drag_drop", self.drag_col), ("ctrl_x", self.reset_selectors), ("delete_key", self.reset_selectors), ("rc_delete_column", self.reset_selectors), ("rc_delete_row", self.reset_selectors), ("rc_insert_column", self.reset_selectors), ("rc_insert_row", self.reset_selectors), ("ctrl_v", self.reset_selectors), ("ctrl_z", self.reset_selectors), ("edit_cell", self.edit_cell_in_sheet) ]) self.sheetdisplay.grid(row=0,column=1,rowspan=3,sticky="nswe") self.cont_ = button(self, text="Build tree with selections ", style="TF.Std.TButton",command=self.try_to_build_tree) self.cont_.grid(row=2,column=0,sticky="wns",padx=10,pady=(10, 50)) self.cont_.config(width=40) self.flattened_selector.grid(row=0,column=0,pady=(0,9),sticky="nswe") self.selector.grid_forget() self.selector.grid(row=0,column=0,sticky="nswe") self.flattened_selector.grid_forget() def flattened_mode_toggle(self): x = self.flattened_choices.get_choices()[0] if x: self.flattened_selector.grid(row=0,column=0,pady=(0,9),sticky="nswe") self.selector.grid_forget() else: self.selector.grid(row=0,column=0,sticky="nswe") self.flattened_selector.grid_forget() def drag_col(self, event): colsiter = sorted(event[1]) c = event[3] stins = colsiter[0] endins = colsiter[-1] + 1 self.selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]]) self.flattened_selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]]) self.selector.detect_id_col() self.selector.detect_par_cols() def drag_row(self, event): rowsiter = sorted(event[1]) r = event[3] stins = rowsiter[0] endins = rowsiter[-1] + 1 self.selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]]) self.flattened_selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]]) self.selector.detect_id_col() self.selector.detect_par_cols() def reset_selectors(self, event = None): idcol = self.selector.get_id_col() parcols = self.selector.get_par_cols() ancparcols = self.flattened_selector.get_par_cols() self.selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]] if self.sheetdisplay.get_sheet_data() else []) self.flattened_selector.set_columns([h for h in self.sheetdisplay.get_sheet_data()[0]] if self.sheetdisplay.get_sheet_data() else []) try: if idcol is not None and self.sheetdisplay.get_sheet_data(): self.selector.set_id_col(idcol) except: pass try: if parcols and self.sheetdisplay.get_sheet_data(): self.selector.set_par_cols(parcols) except: pass try: if ancparcols and self.sheetdisplay.get_sheet_data(): self.flattened_selector.set_par_cols(ancparcols) except: pass def edit_cell_in_sheet(self, event = None): idcol = self.selector.get_id_col() parcols = self.selector.get_par_cols() ancparcols = self.flattened_selector.get_par_cols() if event[1] == idcol or event[1] in parcols or event[1] in ancparcols or event[0] == 0: self.reset_selectors() def enable_widgets(self): self.selector.enable_me() self.flattened_selector.enable_me() self.flattened_choices.enable_me() self.cont_.config(state="normal") self.sheetdisplay.basic_bindings(True) self.sheetdisplay.enable_bindings("enable_all") self.sheetdisplay.extra_bindings([("row_index_drag_drop", self.drag_row), ("column_header_drag_drop", self.drag_col), ("ctrl_x", self.ctrl_x_in_sheet), ("delete_key", self.del_in_sheet), ("rc_delete_column", self.del_in_sheet), ("rc_delete_row", self.del_in_sheet), ("rc_insert_column", self.reset_selectors), ("rc_insert_row", self.reset_selectors), ("ctrl_v", self.ctrl_v_in_sheet), ("ctrl_z", self.ctrl_z_in_sheet), ("edit_cell", self.edit_cell_in_sheet) ]) def disable_widgets(self): self.selector.disable_me() self.flattened_selector.disable_me() self.flattened_choices.disable_me() self.cont_.config(state="disabled") self.sheetdisplay.basic_bindings(False) self.sheetdisplay.disable_bindings("disable_all") self.sheetdisplay.extra_bindings("unbind_all") self.sheetdisplay.unbind("<Delete>") def populate(self, columns, non_tsrgn_xl_file = False): self.sheetdisplay.deselect("all") self.non_tsrgn_xl_file = non_tsrgn_xl_file self.rowlen = len(columns) self.selector.set_columns([h for h in self.C.treeframe.sheet[0]]) self.flattened_selector.set_columns([h for h in self.C.treeframe.sheet[0]]) self.C.treeframe.sheet = self.sheetdisplay.set_sheet_data(data = self.C.treeframe.sheet, redraw=True) self.sheetdisplay.headers(newheaders=0) if len(self.C.treeframe.sheet) < 3000: self.sheetdisplay.set_all_cell_sizes_to_text() self.selector.detect_id_col() self.selector.detect_par_cols() self.flattened_selector.detect_par_cols() self.C.show_frame("columnselection") def try_to_build_tree(self): baseids, order, delcols = self.flattened_choices.get_choices() if baseids: hiers = list(self.flattened_selector.get_par_cols()) if len(hiers) < 2: return else: hiers = list(self.selector.get_par_cols()) if not hiers: return idcol = self.selector.get_id_col() if idcol in hiers or idcol is None: return self.C.status_bar.change_text("Loading... ") self.C.disable_at_start() self.C.treeframe.sheet = self.sheetdisplay.get_sheet_data() if baseids: if order == "Order: Base → Top": idcol = hiers.pop(0) elif order == "Order: Top → Base": idcol = hiers.pop(len(hiers) - 1) self.C.treeframe.sheet[:] = [row + list(repeat("",self.rowlen - len(row))) if len(row) < self.rowlen else row for row in self.C.treeframe.sheet] self.C.treeframe.sheet, self.rowlen, idcol, newpc = self.C.treeframe.treebuilder.convert_flattened_to_normal(data = self.C.treeframe.sheet, idcol = idcol, parcols = hiers, rowlen = self.rowlen, order = order, delcols = delcols, warnings = self.C.treeframe.warnings) hiers = [newpc] self.C.treeframe.headers = [Header(name) for name in self.C.treeframe.fix_heads(self.C.treeframe.sheet.pop(0),self.rowlen)] self.C.treeframe.ic = idcol self.C.treeframe.hiers = hiers self.C.treeframe.pc = hiers[0] self.C.treeframe.row_len = int(self.rowlen) self.C.treeframe.set_metadata(headers = True) self.C.treeframe.sheet, self.C.treeframe.nodes, self.C.treeframe.warnings = self.C.treeframe.treebuilder.build(self.C.treeframe.sheet, self.C.treeframe.new_sheet, self.C.treeframe.row_len, self.C.treeframe.ic, self.C.treeframe.hiers, self.C.treeframe.nodes, self.C.treeframe.warnings) self.C.treeframe.populate(non_tsrgn_xl_file = self.non_tsrgn_xl_file) self.C.treeframe.show_warnings(str(self.C.open_dict['filepath']),str(self.C.open_dict['sheet']))