def _drawMe(self,dir,openColumn): model = TableModel() for c in self.items.columnNames: model.addColumn(c) model.importDict(self.items.columnValues) self.table = ActionableTableCanvas(self, model=model, rowheaderwidth=140, showkeynamesinheader=True,height=125,openColumn=openColumn,dir=dir) self.table.updateModel(model) self.table.createTableFrame()
def _drawMe(self): model = TableModel() for c in self.items.getColumnNames(self.section): model.addColumn(c) model.importDict(self.items.toColumns(self.section)) self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) self.table = ActionableTableCanvas(self, model=model, rowheaderwidth=140, showkeynamesinheader=True,height=125) self.table.updateModel(model) self.table.createTableFrame()
class Table: ''' Excel-like table in tkinter gui ''' def __init__(self, master, columns): # default params self.params = { 'cellwidth': 110, 'precision': 6, } self.data = [] self.model = TableModel() self.columns = columns for column in columns: self.model.addColumn(colname=column) self.table = TableCanvas(parent=master, model=self.model, cellwidth=self.params['cellwidth'], read_only=True) self.table.setSelectedRow(-1) self.table.show() self.n_rows = 0 def set_params(self, params): assert params.keys() == self.params.keys() self.params = params self.table.cellwidth = self.params['cellwidth'] self.refresh() def get_params(self): return self.params.copy() def _process_val(self, val): if val is None: return 'N/A' elif isinstance(val, bool): if val == True: return 'True' else: return 'False' elif isinstance(val, float): if np.isnan(val): return 'N/A' else: return round(val, self.params['precision']) else: return str(val) def transform_data(self, data_list): ''' ''' new_data_list = [] for data in data_list: data = np.array(data, dtype=str) if len(data.shape) == 1: data = np.expand_dims(data, axis=1) assert len(data.shape) == 2 new_data_list.append(data) return np.hstack(new_data_list) def load(self, data, transform=False): ''' ''' if transform: data = self.transform_data(data) if len(data) > self.n_rows: self.model.autoAddRows(len(data) - self.n_rows) self.data.extend([[None for _ in self.columns] for _ in range(len(data) - self.n_rows)]) elif len(data) < self.n_rows: self.model.deleteRows(rowlist=range(len(data), self.n_rows)) del self.data[len(data):] self.n_rows = len(data) for row in range(self.n_rows): row_data = data[row] for j, col in enumerate(self.columns): self.model.data[row][col] = self._process_val(row_data[j]) self.data[row][self.columns.index(col)] = row_data[j] self.table.redrawTable() def insert(self, columns, data, transform=False): ''' Insert data into bottom of the table ''' if transform: data = self.transform_data(data) old_n_rows = self.n_rows if len(data) > 0: self.model.autoAddRows(len(data)) self.data.extend([[None for _ in self.columns] for _ in data]) self.n_rows = old_n_rows + len(data) if columns is None: columns = self.columns for i, row in enumerate(range(old_n_rows, self.n_rows)): row_data = data[i] for j, col in enumerate(columns): self.model.data[row][col] = self._process_val(row_data[j]) self.data[row][self.columns.index(col)] = row_data[j] self.table.redrawTable() def update(self, columns, data, rowids=None, transform=False): ''' Update rows of the table (TODO: support single rowid) ''' if transform: data = self.transform_data(data) if rowids is None: rowids = list(range(len(data))) new_n_rows = len(data) if new_n_rows > self.n_rows: self.model.autoAddRows(new_n_rows - self.n_rows) self.n_rows = new_n_rows if columns is None: columns = self.columns assert len(data) == len(rowids) for i, row in enumerate(rowids): row_data = data[i] for j, col in enumerate(columns): self.model.data[row][col] = self._process_val(row_data[j]) self.data[row][self.columns.index(col)] = row_data[j] self.table.redrawTable() def refresh(self): ''' ''' for row in range(self.n_rows): for j, col in enumerate(self.columns): self.model.data[row][col] = self._process_val(self.data[row][j]) self.table.redrawTable() def get(self, row, column): ''' Get the cell value ''' return self.table.model.data[row][column] def get_column(self, column): ''' Get values of a column ''' return [self.get(row, column) for row in range(self.n_rows)] def export_csv(self): ''' Export table content to a csv file ''' self.table.exportTable()
class PersonsTab(Frame): def __init__(self, notebook): #CARACTERÍSTICAS DE LA PESTAÑA super().__init__(notebook, bg="#%02x%02x%02x" % (166, 185, 180), highlightthickness=1, highlightbackground="black") width = notebook.cget("width") * 3 / 5 height = notebook.cget("height") #TÍTULO DEL PANEL Label(self, text="LISTA DE PERSONAS REGISTRADAS", font=("Verdana", 16, "bold"), bg="#%02x%02x%02x" % (166, 185, 180)).place(relx="0.05", rely="0.05") #BOTÓN PARA CERRAR EL PANEL DE PESTAÑAS Button(self, text="Cerrar Menú", font=("Verdana", 12), command=lambda: self.close(notebook)).place(relx="0.85", rely="0.05") #CREA LA TABLA DE PERSONAS self.tableFrame = Frame(self) self.model = TableModel() self.model.addColumn(colname="DNI") self.model.columnwidths["DNI"] = 90 self.model.addColumn(colname="APELLIDO") self.model.columnwidths["APELLIDO"] = 90 self.model.addColumn(colname="NOMBRES") self.model.addColumn(colname="FECHA DE NAC.") self.model.columnwidths["FECHA DE NAC."] = 130 self.model.addColumn(colname="DOMICILIO") self.model.columnwidths["DOMICILIO"] = 147 self.model.addColumn(colname="NACIONALIDAD") self.model.columnwidths["NACIONALIDAD"] = 120 self.model.addColumn(colname="CATEGORÍA") self.model.columnwidths["CATEGORÍA"] = 90 self.model.addColumn(colname="TIPO SANGRE") self.model.columnwidths["TIPO SANGRE"] = 110 self.personsTable = TableCanvas(self.tableFrame, model=self.model, width=900, thefont=("Arial", 10), read_only=True) self.personsTable.show() self.tableFrame.place(relx="0.05", rely="0.15") self.showPersons() #BOTÓN PARA AÑADIR REGISTRO Button(self, text='AÑADIR REGISTRO', width=20, font=("Verdana", 14), command=lambda: notebook.createAddPersonTab()).place(relx=0.1, rely=0.7) #BOTÓN PARA MODIFICAR REGISTRO Button(self, text='MODIFICAR REGISTRO', width=20, font=("Verdana", 14), command=lambda: notebook.createModifyPersonTab()).place( relx=0.4, rely=0.7) #BOTÓN PARA ELIMINAR REGISTRO Button(self, text='ELIMINAR REGISTRO', width=20, font=("Verdana", 14), command=lambda: notebook.createDeletePersonToplevel()).place( relx=0.7, rely=0.7) #FUNCIÓN PARA OBTENER Y CARGAR LAS PERSONAS REGISTRADAS def showPersons(self): persons = DBManager().getAllPersons() self.model.deleteRows() dataModel = {} for person in persons: birthdate = "%02d-%02d-%4d" % (person[3].day, person[3].month, person[3].year) dataModel[person[0]] = { 'DNI': person[0], 'APELLIDO': person[1], 'NOMBRES': person[2], 'FECHA DE NAC.': birthdate, 'DOMICILIO': person[4], 'NACIONALIDAD': person[5], 'CATEGORÍA': person[6], 'TIPO SANGRE': person[7] } self.model.importDict(dataModel) self.personsTable.redraw() #OBTIENE LA FILA SELECCIONADA def getSelectedRow(self): return (self.personsTable.get_currentRecord()) #CERRAR LA PESTAÑA Y ACCIONES COMPLEMENTARIAS def close(self, notebook): if notebook.addPersonFlag == 0 and notebook.modifyPersonFlag == 0 and notebook.deletePersonFlag == 0: notebook.container.personsFlag = 0 notebook.container.principalFrame.searchBox["state"] = "normal" notebook.container.principalFrame.search() notebook.destroy() else: #PARA PODER CERRAR EL PANEL, LAS PESTAÑAS DEBEN ESTAR CERRADAS messagebox.showwarning( "Advertencia", "Para poder cerrar el menú no debe haber ninguna pestaña abierta" )
def initUI(self): self.parent.title("Caritas") self.style = Style() self.style.theme_use("default") self.pack(fill=BOTH, expand=1) frameMenu = Frame(self) frameMenu.pack(fill="both", expand="0", side=RIGHT) labelBusqueda = LabelFrame(frameMenu, text="Busqueda") labelBusqueda.pack(fill="x",expand =1) labelVoluntarios = LabelFrame(frameMenu) labelVoluntarios.pack(fill="both",expand =0) frameTabla = Frame(self) frameTabla.pack(fill="both", expand="1", side=LEFT) labelTabla = LabelFrame(frameTabla) labelTabla.pack(fill="both", expand="1") labelBotonera = LabelFrame(frameTabla) labelTabla.pack(fill="both", expand="1") labelSelect = LabelFrame(frameTabla) labelSelect.pack(fill="both", expand="1") model = TableModel() modelSelect = TableModel() model.addColumn("nombre") model.addColumn("apellidos") model.addColumn("dni") model.addColumn("direccion") model.addColumn("correo_electronico") model.addColumn("estudio") model.addColumn("parroquial") model.addColumn("proyecto") model.addColumn("genero") model.addColumn("fecha_nacimiento") model.addColumn("telefono_1") model.addColumn("telefono_2") modelSelect.addColumn("nombre") modelSelect.addColumn("apellidos") modelSelect.addColumn("dni") modelSelect.addColumn("direccion") modelSelect.addColumn("correo_electronico") modelSelect.addColumn("estudio") modelSelect.addColumn("parroquial") modelSelect.addColumn("proyecto") modelSelect.addColumn("genero") modelSelect.addColumn("fecha_nacimiento") modelSelect.addColumn("telefono_1") modelSelect.addColumn("telefono_2") #Tabla Voluntarios self.listilla= queryAllVoluntarios() model.importDict(self.listilla) self.table = TableCanvas(labelTabla, model=model,editable=False) self.table.createTableFrame() self.table.handle_double_click(self.eventoClic) #Tabla Seleccionados self.selectTable = TableCanvas(labelSelect, model=modelSelect,editable=False) self.selectTable.createTableFrame() self.listadoSeleccionado = [] L1 = Label(labelBusqueda, text="Nombre") L1.pack() E1 = Entry(labelBusqueda) E1.pack() L2 = Label(labelBusqueda, text="Apellidos") L2.pack() E2 = Entry(labelBusqueda) E2.pack() botonArriba = Button(labelVoluntarios, text="Agregar al listado", command=lambda:self.agregarListado(self.table.getSelectedRow())) botonArriba.pack() botonAbajo = Button(labelVoluntarios, text="Quitar del listado", command=lambda:self.quitarListado(self.selectTable.getSelectedRow())) botonAbajo.pack() button = Button(labelBusqueda, text="Buscar", command=lambda: self.buscar(E1.get(),E2.get())) button.pack() button = Button(labelVoluntarios, text="Nuevo Voluntario", command=lambda:self.ventanaVoluntarios(-1)) button.pack() buttonEditar = Button(labelVoluntarios, text="Editar Voluntario", command=lambda:self.ventanaVoluntarios(self.table.getSelectedRow())) buttonEditar.pack() buttonImprimir = Button(labelVoluntarios, text="Imprimir", command=lambda:self.ventanaImprimir()) buttonImprimir.pack()
def buscar(self,nombre,apellidos): modelCompleto = TableModel() modelNuevo = TableModel() modelNuevo.addColumn("nombre") modelNuevo.addColumn("apellidos") modelNuevo.addColumn("dni") modelNuevo.addColumn("direccion") modelNuevo.addColumn("correo_electronico") modelNuevo.addColumn("estudio") modelNuevo.addColumn("parroquial") modelNuevo.addColumn("proyecto") modelNuevo.addColumn("genero") modelNuevo.addColumn("fecha_nacimiento") modelNuevo.addColumn("telefono_1") modelNuevo.addColumn("telefono_2") self.listilla= queryAllVoluntarios() modelCompleto.importDict(self.listilla) searchterms = [('nombre', nombre, 'contains', 'AND'),('apellidos', apellidos, 'contains', 'AND')] result=modelCompleto.getDict(modelCompleto.columnNames, filters=searchterms) modelNuevo.importDict(result) self.listadoSeleccionado = result self.table.updateModel(modelNuevo) self.table.redrawTable()
def quitarListado(self,numero): voluntario = self.selectTable.model.getRecordAtRow(numero) modelNuevo = TableModel() modelNuevo.addColumn("nombre") modelNuevo.addColumn("apellidos") modelNuevo.addColumn("dni") modelNuevo.addColumn("direccion") modelNuevo.addColumn("correo_electronico") modelNuevo.addColumn("estudio") modelNuevo.addColumn("parroquial") modelNuevo.addColumn("proyecto") modelNuevo.addColumn("genero") modelNuevo.addColumn("fecha_nacimiento") modelNuevo.addColumn("telefono_1") modelNuevo.addColumn("telefono_2") print numero arrayListado = self.selectTable.getModel().data valores = {} i=1 for values in arrayListado: if numero+1 != i: valores['row',i]=arrayListado['row',i] i+=1 modelNuevo.importDict(valores) self.selectTable.updateModel(modelNuevo) self.selectTable.redrawTable()
class VehiclesTab(Frame): def __init__(self, notebook): super().__init__(notebook, bg="#%02x%02x%02x" % (166, 185, 180), highlightthickness=1, highlightbackground="black") #TÍTULO DE LA PESTAÑA Label(self, text="LISTA DE VEHÍCULOS REGISTRADOS", font=("Verdana", 16, "bold"), bg="#%02x%02x%02x" % (166, 185, 180)).place(relx="0.05", rely="0.05") #CREA TABLA DE VEHÍCULOS self.tableFrame = Frame(self) self.model = TableModel() self.model.addColumn(colname="DOMINIO") self.model.columnwidths["DOMINIO"] = 90 self.model.addColumn(colname="TITULAR") self.model.columnwidths["TITULAR"] = 90 self.model.addColumn(colname="TIPO") self.model.addColumn(colname="MARCA") self.model.addColumn(colname="MODELO") self.model.columnwidths["MODELO"] = 90 self.model.addColumn(colname="AÑO") self.model.columnwidths["AÑO"] = 75 self.model.addColumn(colname="VIN") self.model.columnwidths["VIN"] = 200 self.vehiclesTable = TableCanvas(self.tableFrame, model=self.model, width=790, thefont=("Arial", 10), read_only=True) self.vehiclesTable.show() self.tableFrame.place(relx="0.10", rely="0.15") self.showVehicles() #BOTÓN PARA CERRAR LAS PESTAÑAS DE VEHÍCULO Button(self, text="Cerrar Menú", font=("Verdana", 12), command=lambda: self.close(notebook)).place(relx="0.85", rely="0.05") #BOTÓN PARA AÑADIR REGISTRO Button(self, text='AÑADIR REGISTRO', width=20, font=("Verdana", 14), command=lambda: notebook.createAddVehicleTab()).place(relx=0.1, rely=0.7) #BOTÓN PARA MODIFICAR REGISTRO Button(self, text='MODIFICAR REGISTRO', width=20, font=("Verdana", 14), command=lambda: notebook.createModifyVehicleTab()).place( relx=0.39, rely=0.7) #BOTÓN PARA ELIMINAR REGISTRO Button(self, text='ELIMINAR REGISTRO', width=20, font=("Verdana", 14), command=lambda: notebook.createDeleteVehicleToplevel()).place( relx=0.68, rely=0.7) #FUNCIÓN PARA CARGAR LA TABLE DE VEHÍCULOS def showVehicles(self): vehicles = DBManager().getAllVehicles() self.model.deleteRows() dataModel = {} for vehicle in vehicles: dataModel[vehicle[0]] = { 'DOMINIO': vehicle[0], 'TITULAR': vehicle[6], 'TIPO': vehicle[1], 'MARCA': vehicle[2], 'MODELO': vehicle[3], 'AÑO': str(vehicle[4]), 'VIN': vehicle[5] } self.model.importDict(dataModel) self.vehiclesTable.redraw() #self.vehiclesTable.adjustColumnWidths() #DEVUELVE LA FILA SELECCIONADA def getSelectedRow(self): return (self.vehiclesTable.get_currentRecord()) #CIERRA EL PANEL ACTUAL Y REALIZA LOS CAMBIOS CORRESPONDIENTES. #PARA CERRAR EL PANEL, LOS PANELES DE CREACIÓN, MODIFICACIÓN Y ELIMINACIÓN DEBEN ESTAR CERRADOS def close(self, notebook): if notebook.addVehicleFlag == 0 and notebook.modifyVehicleFlag == 0 and notebook.deleteVehicleFlag == 0: notebook.container.vehiclesFlag = 0 notebook.container.principalFrame.searchBox["state"] = "normal" notebook.container.principalFrame.search() notebook.destroy() else: messagebox.showwarning( "Advertencia", "Para poder cerrar el menú no debe haber ninguna pestaña abierta" )
class ResultSearchTab(Frame): def __init__(self, frame): #CARACTERÍSTICAS DEL PANEL width = frame.cget("width") * 3 / 5 height = frame.cget("height") bgcolor1 = "#%02x%02x%02x" % (157, 168, 244) super().__init__(frame, bg=bgcolor1, highlightthickness=1, highlightbackground="black") #TITULO DE VENTANA Label(self, text="DATOS DEL VEHÍCULO", font=("Verdana", 14, "bold"), bg=bgcolor1).place(relx=0.35, rely=0.04) #PANEL DE DATOS DEL VEHÍCULO dataVehicle = Frame(self, bg=bgcolor1, width=width, height=100) dataVehicle.place(relx=0.02, rely=0.1) bgcolor2 = "#%02x%02x%02x" % (198, 204, 249) Label(dataVehicle, text="Dominio", width=15, bg=bgcolor1, relief="groove", borderwidth=4, font=("Verdana", 11, "italic")).grid(row=1, column=1) Label(dataVehicle, text="Tipo", width=15, bg=bgcolor1, relief="groove", borderwidth=4, font=("Verdana", 11, "italic")).grid(row=1, column=3) Label(dataVehicle, text="N° de Motor", width=15, bg=bgcolor1, relief="groove", borderwidth=4, font=("Verdana", 11, "italic")).grid(row=1, column=5) Label(dataVehicle, text="Marca", width=15, bg=bgcolor1, relief="groove", borderwidth=4, font=("Verdana", 11, "italic")).grid(row=2, column=1) Label(dataVehicle, text="Modelo", width=15, bg=bgcolor1, relief="groove", borderwidth=4, font=("Verdana", 11, "italic")).grid(row=2, column=3) Label(dataVehicle, text="Año", width=15, bg=bgcolor1, relief="groove", borderwidth=4, font=("Verdana", 11, "italic")).grid(row=2, column=5) Label(dataVehicle, text="Titular", width=15, bg=bgcolor1, relief="groove", borderwidth=4, font=("Verdana", 11, "italic")).grid(row=3, column=1) Label(dataVehicle, text="DNI", width=15, bg=bgcolor1, relief="groove", borderwidth=4, font=("Verdana", 11, "italic")).grid(row=3, column=5) #DOMINIO self.domainLabel = Label(dataVehicle, font=("Verdana", 12, "italic"), width=15, bg=bgcolor2) self.domainLabel.grid(row=1, column=2) #TIPO DE VEHÍCULO self.kindLabel = Label(dataVehicle, font=("Verdana", 12, "italic"), width=15, bg=bgcolor2) self.kindLabel.grid(row=1, column=4) #NÚMERO DE MOTOR self.engineLabel = Label(dataVehicle, font=("Verdana", 12, "italic"), width=20, bg=bgcolor2) self.engineLabel.grid(row=1, column=6) #MARCA self.brandLabel = Label(dataVehicle, font=("Verdana", 12, "italic"), width=15, bg=bgcolor2) self.brandLabel.grid(row=2, column=2) #MODELO self.modelLabel = Label(dataVehicle, font=("Verdana", 12, "italic"), width=15, bg=bgcolor2) self.modelLabel.grid(row=2, column=4) #AÑO self.yearLabel = Label(dataVehicle, font=("Verdana", 12, "italic"), width=20, bg=bgcolor2) self.yearLabel.grid(row=2, column=6) #TITULAR self.titularLabel = Label(dataVehicle, font=("Verdana", 12, "italic"), anchor="w", width=45, bg=bgcolor2) self.titularLabel.grid(row=3, column=2, columnspan=3) #DNI DEL TITULAR self.dniLabel = Label(dataVehicle, font=("Verdana", 12, "italic"), width=20, bg=bgcolor2) self.dniLabel.grid(row=3, column=6) #CREA TABLA DE INFRACCIONES self.tableFrame = Frame(self) self.model = TableModel() self.model.addColumn(colname="ID") self.model.columnwidths["ID"] = 80 self.model.addColumn(colname="DNI RESPONSABLE") self.model.columnwidths["DNI RESPONSABLE"] = 90 self.model.addColumn(colname="CAUSA") self.model.addColumn(colname="AGENTE") self.model.addColumn(colname="FECHA") self.model.addColumn(colname="LUGAR") self.model.addColumn(colname="MONTO") self.model.columnwidths["MONTO"] = 70 self.model.addColumn(colname="PAGADO") self.model.columnwidths["PAGADO"] = 70 self.infractionsTable = TableCanvas(self.tableFrame, model=self.model, width=938, thefont=("Arial", 10), read_only=True) self.infractionsTable.show() self.tableFrame.place(x="20", rely="0.35") #CREA MENSAJE DE ESTADO DE CUENTA self.message = StringVar() self.debtLabel = Label(self, textvariable=self.message, font=("Verdana", 12)) self.debtLabel.place(x="30", rely="0.30") #FUNCIÓN QUE DEVUELVE LA FILA SELECCIONADA def getSelectedRow(self): return (self.infractionsTable.get_currentRecord()) #FUNCIÓN QUE CARGA EL PANEL Y LA TABLA DE INFRACCIONES CON LOS DATOS CORRESPONDIENTES def showData(self, data): self.model.deleteRows() dataModel = {} if data != None: self.domainLabel.configure(text=data[0]) self.kindLabel.configure(text=data[1]) self.brandLabel.configure(text=data[2]) self.modelLabel.configure(text=data[3]) self.yearLabel.configure(text=data[4]) self.engineLabel.configure(text=data[5]) self.titularLabel.configure(text=data[7] + ", " + data[8]) self.dniLabel.configure(text=data[6]) infractions = DBManager().getInfractions(data[0]) self.debt = 0.00 for infraction in infractions: isPay = 'NO' if (infraction[8] == 1): isPay = 'SI' dateandhour = "%02d-%02d-%4d %02d:%02d" % ( infraction[5].day, infraction[5].month, infraction[5].year, infraction[5].hour, infraction[5].minute) dateandhourpaid = "-" if (infraction[9] != None): dateandhourpaid = "%02d-%02d-%4d %02d:%02d" % ( infraction[9].day, infraction[9].month, infraction[9].year, infraction[9].hour, infraction[9].minute) dataModel[infraction[0]] = { 'ID': "%07d" % (infraction[0]), 'DNI RESPONSABLE': str(infraction[1]), 'CAUSA': str(infraction[3]), 'AGENTE': str(infraction[4]), 'FECHA': dateandhour, 'LUGAR': str(infraction[6]), 'MONTO': "%.2f" % (infraction[7]), 'PAGADO': isPay, 'FECHA PAGO': dateandhourpaid } if (infraction[8] == 0): self.debt = self.debt + float(infraction[7]) if (self.debt > 0): self.message.set("Presenta una deuda de $ " + str(self.debt)) else: self.message.set("No presenta deudas.") #SI LA BÚSQUEDA NO ARROJA RESULTADOS, LOS CAMPOS SE MUESTRAN EN BLANCO else: self.domainLabel.configure(text="") self.kindLabel.configure(text="") self.brandLabel.configure(text="") self.modelLabel.configure(text="") self.yearLabel.configure(text="") self.engineLabel.configure(text="") self.titularLabel.configure(text="") self.dniLabel.configure(text="") self.message.set("") #ACTUALIZA EL CONTENIDO DE LA TABLA self.model.importDict(dataModel) self.infractionsTable.redraw() self.infractionsTable.autoResizeColumns()