Exemple #1
0
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()
Exemple #2
0
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()
Exemple #3
0
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"
            )
Exemple #4
0
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()
Exemple #5
0
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()