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 SalariesCalculator(): def __init__(self, Salaries): date_var1 = tk.StringVar() date_var2 = tk.StringVar() self.Worker = "Francisco" self.window = Salaries Date = str(date.today().strftime("%d/%m/%Y")) if Date[0:2] <= '15': D1 = "01" + Date[2:] D2 = "15" + Date[2:] else: D1 = "16" + Date[2:] D2 = Date X = 50 Y = 50 Lb = tk.Label(self.window, bg='skyblue', font=("Arial", 12), text="De:") Lb.place(x=X + 80, y=Y) self.Date1 = tk.Entry(self.window, bg='white', font=("Arial", 12), textvariable=date_var1) date_var1.set(D1) self.Date1.place(x=X + 80, y=Y + 30) Lb = tk.Label(self.window, bg='skyblue', font=("Arial", 12), text="Hasta:") Lb.place(x=X + 80, y=Y + 60) self.Date2 = tk.Entry(self.window, bg='white', font=("Arial", 12), textvariable=date_var2) date_var2.set(D2) self.Date2.place(x=X + 80, y=Y + 90) Lb = tk.Label(self.window, bg='skyblue', font=("Arial", 12), text="Concepto:") Lb.place(x=X + 335, y=Y) self.Worker_list = tk.Listbox(self.window, bg='white', fg='black', height=3, selectmode='SINGLE', width=25, font=("Arial", 12)) Workers = ['Francisco', 'Guadalupe', 'Diego'] for item in Workers: self.Worker_list.insert(tk.END, item) self.Worker_list.place(x=X + 335, y=Y + 30) self.Worker_list.bind("<ButtonRelease-1>", self.update_table) ###### Tabla de Salarios ###### Lb = tk.Label(self.window, bg='skyblue', font=("Arial", 12), text="Salarios:") Lb.place(x=X + 663, y=Y) Fecha = self.Date1.get() Fecha1 = Fecha[6:10] + "-" + Fecha[3:5] + "-" + Fecha[0:2] Fecha = self.Date2.get() Fecha2 = Fecha[6:10] + "-" + Fecha[3:5] + "-" + Fecha[0:2] try: SelectQuery = "SELECT Responsable, SUM(Monto) AS Salario FROM Transactions.dbo.Transactions \ where Concepto = 'Sueldo' and Fecha between '" + Fecha1 \ + "' and '" + Fecha2 + "' GROUP BY Responsable;" Data = pd.read_sql(SelectQuery, conn) except: df = { 'Responsable': ['Francisco', 'Guadalupe', 'Diego'], 'Salario': ['', '', ''] } Data = pd.DataFrame(df) tframe_sal = tk.Frame(self.window, bg="blue", highlightcolor="blue") tframe_sal.place(x=X + 663, y=Y + 30, height=130, width=318) rec, col = Data.shape aux = dict() data = dict() for i in range(rec): for j in range(col): aux[Data.columns[j]] = Data.values[i, j] data['rec' + str(i + 1)] = aux.copy() self.model_sal = TableModel() self.table_sal = TableCanvas(tframe_sal, cellbackgr='white', thefont=( 'Arial', 12, ), cellwidth=140, rowheight=25, rowheaderwidth=30, rowselectedcolor='yellow', editable=False, model=self.model_sal) self.table_sal.createTableFrame() self.model_sal = self.table_sal.model self.model_sal.importDict(data) self.table_sal.show() ###### Tabla de Actividades ###### try: SelectQuery = "SELECT #, Fecha, Concepto, Monto, Responsable, Comentario FROM Transactions.dbo.Transactions \ where Concepto = 'Sueldo' and Responsable = '" + self.Worker + "' and Fecha between '"+ Fecha1 \ + "' and '" + Fecha2 + "';" Data = pd.read_sql(SelectQuery, conn) except: df = { '#': [''], 'Fecha': [''], 'Concepto': [''], 'Monto': [''], 'Responsable': [''], 'Comentario': [''] } Data = pd.DataFrame(df) tframe_act = tk.Frame(self.window, bg="blue", highlightcolor="blue") tframe_act.place(x=X + 80, y=Y + 135, height=350, width=900) rec, col = Data.shape aux = dict() data = dict() for i in range(rec): for j in range(col): aux[Data.columns[j]] = Data.values[i, j] data['rec' + str(i + 1)] = aux.copy() self.model_act = TableModel() self.table_act = TableCanvas(tframe_act, cellbackgr='white', thefont=( 'Arial', 12, ), cellwidth=140, rowheight=25, rowheaderwidth=30, rowselectedcolor='yellow', editable=False, model=self.model_act) self.table_act.createTableFrame() self.model_act = self.table_act.model self.model_act.importDict(data) self.table_act.show() def update_table(self, event): widget = event.widget selection = widget.curselection() self.Worker = widget.get(selection[0]) Fecha = self.Date1.get() Fecha1 = Fecha[6:10] + "-" + Fecha[3:5] + "-" + Fecha[0:2] Fecha = self.Date2.get() Fecha2 = Fecha[6:10] + "-" + Fecha[3:5] + "-" + Fecha[0:2] try: SelectQuery = "SELECT #, Fecha, Concepto, Monto, Responsable, Comentario FROM Transactions.dbo.Transactions \ where Concepto = 'Sueldo' and Responsable = '" + self.Worker + "' and Fecha between '"+ Fecha1 \ + "' and '" + Fecha2 + "';" Data = pd.read_sql(SelectQuery, conn) except: df = { '#': [''], 'Fecha': [''], 'Concepto': [''], 'Monto': [''], 'Responsable': [''], 'Comentario': [''] } Data = pd.DataFrame(df) rec, col = Data.shape aux = dict() data = dict() for i in range(rec): for j in range(col): aux[Data.columns[j]] = Data.values[i, j] data['rec' + str(i + 1)] = aux.copy() self.model_act.deleteRows(range(0, self.model_act.getRowCount())) self.model_act.importDict(data) self.table_act.redraw() try: SelectQuery = "SELECT Responsable, SUM(Monto) AS Salario FROM Transactions.dbo.Transactions \ where Concepto = 'Sueldo' and Fecha between '" + Fecha1 \ + "' and '" + Fecha2 + "' GROUP BY Responsable;" Data = pd.read_sql(SelectQuery, conn) except: df = { 'Responsable': ['Francisco', 'Guadalupe', 'Diego'], 'Salario': ['', '', ''] } Data = pd.DataFrame(df) rec, col = Data.shape aux = dict() data = dict() for i in range(rec): for j in range(col): aux[Data.columns[j]] = Data.values[i, j] data['rec' + str(i + 1)] = aux.copy() self.model_sal.deleteRows(range(0, self.model_sal.getRowCount())) self.model_sal.importDict(data) self.table_sal.redraw()
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" )
class RRInterface(Frame): today = datetime.datetime.now().date() pieces = [] def __init__(self, master=None): Frame.__init__(self, master) self.pack() self.configure(width=1250, height=500) self.frCal = Frame(self) self.frCal.place(relx=0, rely=0) self.frCal.configure(bd=1, relief=RAISED) self.calWidget = tkcalendar.Calendar(self.frCal, showweeknumbers=False, locale="ru_RU", maxdate=self.today) self.calWidget.pack() self.calWidget.bind('<<CalendarSelected>>', self.getDate) self.dayDataFrame = Frame(self) self.dayDataFrame.grid_propagate(0) self.dayDataFrame.place(relx=0, rely=1, anchor=SW) self.dayDataFrame.configure(width=1250, height=300, bd=1, relief=RAISED) self.tableModel = TableModel() self.table = TableCanvas(self.dayDataFrame, cellwidth=300, model=self.tableModel, rowheight=25) self.table.show() self.drawFrame = Frame(self) self.drawFrame.grid_propagate(0) self.drawFrame.place(relx=1, rely=0, anchor=NE) self.drawFrame.configure(width=966, height=200, bd=1, relief=RAISED) self.createCanvas() self.dateList = [] self.hourUsed = [0 for i in range(24)] self.strInfo = StringVar() self.labelInfo = Label(self, textvariable=self.strInfo, width=30, height=1, bg='white', bd=1, relief=RAISED, font='Arial 10') self.strInfo.set('Test') self.labelInfo.place(x=0, y=175) self.createFileList() self.createTable() self.readReportFile(self.today) def createCanvas(self): self.drawCanvas = Canvas(self.drawFrame, bg='white') self.drawCanvas.place(x=0, y=0) self.drawCanvas.configure(width=960, height=194) for i in range(24): self.drawCanvas.create_line((i + 1) * 40, 0, (i + 1) * 40, 180, fill='black') self.drawCanvas.create_text((i + 1) * 40 - 20, 90, text=str(i), font="Verdana 14") self.drawCanvas.create_line(0, 180, 960, 180, fill='black') def getDate(self, event=None): date = self.calWidget.selection_get() self.readReportFile(date) def createFileList(self): fileList = glob.glob(reportFolder + "\\*.REP") for file in fileList: file = file.replace(reportFolder + "\\", "") if int(file[1:5]) < 2000: continue self.dateList.append( datetime.date(year=int(file[1:5]), month=monthToInt.get(file[5:8]), day=int(file[8:10]))) self.dateList.sort() if len(self.dateList) > 0: self.calWidget.configure(mindate=self.dateList[0]) else: self.calWidget.configure(mindate=datetime.datetime.now()) def createTable(self): data = { 'def': { 'Program name': 'test', 'Start': '00:00:00', 'End': '23:59:59', 'Time': '23:59:59', 'Thickness': 99, 'Pieces': 999, 'Produced': 111, 'Remained': 888, 'State': 'Ok' } } self.tableModel.importDict(data) self.table.resizeColumn(1, 150) self.table.resizeColumn(2, 150) self.table.resizeColumn(3, 70) self.table.resizeColumn(4, 90) self.table.resizeColumn(5, 60) self.table.resizeColumn(6, 80) self.table.resizeColumn(7, 80) def readReportFile(self, date): # R1970Jan01.REP fileName = 'R' + str(date.year) + intToMonth[date.month] if date.day < 10: fileName = fileName + '0' + str(date.day) else: fileName = fileName + str(date.day) fileName = reportFolder + '\\' + fileName + '.REP' self.pieces.clear() self.drawCanvas.delete('piece') self.tableModel.deleteRows(range(self.tableModel.getRowCount())) self.table.redraw() if not os.path.exists(fileName): self.strInfo.set('File not exist') return with open(fileName, 'r', encoding="utf-8") as scannedFile: fileData = scannedFile.read() pieces = fileData.split('\n\n') for i in range(len(pieces)): lines = pieces[i].split('\n') lineDict = {} for line in lines: ll = line.replace("\n", "").split('=') if len(ll) < 2: continue lineDict[ll[0]] = ll[1] self.pieces.append( PieceData(ID=len(self.pieces), name=lineDict.get('PROGRAM NAME'), start=lineDict.get('START'), end=lineDict.get('END'), time=lineDict.get('MACHINING TIME'), thickness=lineDict.get('WORKPIECE THICKNESS'), pieces=lineDict.get('NUMBER OF PIECES'), produced=lineDict.get('NR OF PIECES PRODUCED'), remained=lineDict.get('NR OF PIECES REMAINING'), state=lineDict.get('STATE'), date=date)) counter = 0 while counter < len(self.pieces): if self.pieces[counter].programName == '[ERROR]' and self.pieces[ counter].id > 0: self.pieces.pop(counter) else: counter += 1 self.strInfo.set(str(date) + "\t Pieces: " + str(len(self.pieces))) self.addDayDataToCanvas() self.addDayDataToTable() def addDayDataToCanvas(self): for i in range(len(self.hourUsed)): self.hourUsed[i] = 0 for piece in self.pieces: if piece.programName == '[ERROR]' and piece.id > 0: continue start = piece.startTime end = piece.endTime pieceColor = getRandomColor() sX = start.hour * 40 sY = 180 - (start.minute + start.second / 60) * 3 eX = sX + 40 eY = 180 - (end.minute + end.second / 60) * 3 if end.hour != start.hour: self.hourUsed[end.hour] += \ (end - end.replace(hour=end.hour, minute=0, second=0)).seconds currHour = start.hour + 1 finalHour = end.hour if finalHour < currHour: finalHour = 23 for hH in range(currHour, finalHour): self.drawCanvas.create_rectangle(hH * 40, 180, (hH + 1) * 40, 0, fill=pieceColor, tag="piece") self.hourUsed[hH] += 3600 tsX = finalHour * 40 tsY = 180 teX = tsX + 40 teY = eY eY = 0 self.drawCanvas.create_rectangle(tsX, tsY, teX, teY, fill=pieceColor, tag="piece") if start.hour < 23: self.hourUsed[start.hour] += (start.replace( hour=start.hour + 1, minute=0, second=0) - start).seconds else: nextDay = start + datetime.timedelta(seconds=3600) self.hourUsed[start.hour] += ( nextDay.replace(hour=0, minute=0, second=0) - start).seconds else: self.hourUsed[start.hour] += (end - start).seconds self.drawCanvas.create_rectangle(sX, sY, eX, eY, fill=pieceColor, tag="piece") for i in range(24): used = toFixed(self.hourUsed[i] / 36, 2) tt = self.drawCanvas.create_text(i * 40 + 20, 188, text=used, tag="piece") if tt > 100000: self.drawCanvas.delete('all') self.drawCanvas.destroy() self.createCanvas() self.addDayDataToCanvas() def addDayDataToTable(self): for piece in self.pieces: data = { piece.id: { 'Program name': piece.programName, 'Start': str(piece.startTime), 'End': str(piece.endTime), 'Time': str(piece.timeTime), 'Thickness': piece.thickness, 'Pieces': piece.pieces, 'Produced': piece.produced, 'Remained': piece.remained, 'State': piece.state } } self.tableModel.importDict(data) self.table.redraw()
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()