def eliminar_datos(self):

        numRows = self.guardadas.ui.tabla_graficas.rowCount()
        if numRows > 0:

            index = (self.guardadas.ui.tabla_graficas.currentRow())
            print(index)
            if index > -1:
                delete = showdialog(
                    "Advertencia",
                    f"Desea eliminar el registro de la fila {index+1}")
                if delete == 1024:
                    try:
                        fecha = self.guardadas.ui.tabla_graficas.item(
                            index, 0).text()
                        conexion = conectar(bd)
                        cursor = _cursor(conexion)
                        eliminar(conexion, cursor, fecha)
                        desconectar(conexion)
                    except:
                        pass
                    else:
                        self.guardadas.fillTable()
            else:
                showMessage("Error", "Ningun registro ha sido seleccionado")

        else:
            showMessage("Error", "No hay ningún registro aún")
def insertar(my_db, cursor, titulo, x, valores_x, y, valores_y, tipo, libreria,
             comentarios, fecha):
    valores_x_remix = ""
    valores_y_remix = ""
    for i in valores_x:
        valores_x_remix += str(i)
        valores_x_remix += "|"
    for i in valores_y:
        valores_y_remix += str(i)
        valores_y_remix += "|"
    try:
        values = (titulo, x, valores_x_remix, y, valores_y_remix, tipo,
                  libreria, comentarios, fecha)
        sql = f"INSERT INTO configuracion_graficas (titulo,titulo_x,valores_x,titulo_y,valores_y,tipo_grafica,libreria,comentarios,fecha) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)"

        cursor.execute(sql, values)
        my_db.commit()
    except mysql.connector.errors.Error as err:
        showMessage("Error", str(err))
    except:
        _error = "Error al insertar el registro, asegurese de tener bien configurada la base de datos."
        showMessage("ERROR", f"{_error}")
    else:
        if fecha != "2015-12-11 00:00:00":

            mensaje = "SE HA GUARDADO LA TABLA CORRECTAMENTE"
            _done = showMessage("HECHO", f"{mensaje}")
def desconectar(my_db):
    try:
        my_db.close()
    except mysql.connector.errors.Error as err:
        showMessage("Error", str(err))
    except:
        texto = "Error al desconectarse de la base de datos."
        _error = showMessage("Error", texto)
    def rellenar(self):
        global comentarios_grabados
        valores = []
        valores_x = []
        valores_y = []
        numRows = self.guardadas.ui.tabla_graficas.rowCount()
        if numRows > 0:
            try:
                fila = (self.guardadas.ui.tabla_graficas.currentRow())
                for i in range(9):

                    if i == 5:

                        cb = self.guardadas.ui.tabla_graficas.cellWidget(
                            fila, i)
                        for y in range(len(cb)):
                            valores_x.append(cb.itemText(y))
                        valores.append(valores_x)
                    elif i == 7:
                        cb = self.guardadas.ui.tabla_graficas.cellWidget(
                            fila, i)
                        for y in range(len(cb)):
                            valores_y.append(cb.itemText(y))
                        valores.append(valores_y)
                    elif i != 5 and i != 7:

                        valores.append(
                            self.guardadas.ui.tabla_graficas.item(fila,
                                                                  i).text())

                print(valores)

                for i in self.ui.rb_group_tipo.buttons():
                    if i.text() == valores[2]:
                        i.setChecked(True)

                for i in self.ui.rb_group_libreria.buttons():
                    if i.text() == valores[3]:
                        i.setChecked(True)
                comentarios_grabados = valores[8]
                self.ui.ipt_titulo_grafica.setText(valores[1])
                self.ui.ipt_eje_x.setText(valores[4])
                self.ui.ipt_eje_y.setText(valores[6])
                self.borrar_contenido()
                n = len(valores[5])
                self.fillTable(n)
                for i in range(n):
                    self.ui.tw_datos.setItem(
                        i, 0, QtWidgets.QTableWidgetItem(str(valores[5][i])))
                    self.ui.tw_datos.setItem(
                        i, 1, QtWidgets.QTableWidgetItem(str(valores[7][i])))

                self.guardadas.close()
            except:
                showMessage("Error", "No ha seleccionado ningún registro")

        else:
            showMessage("Error", "No hay registros")
def _cursor(my_db):
    try:

        mycursor = my_db.cursor()
    except mysql.connector.errors.Error as err:
        showMessage("Error", str(err))
    except:
        _error = "Error al intentar definir el cursor. Favor de verificar los parametros de conexion con la base de datos."
        showMessage("ERROR", f"{_error}")
    else:
        return mycursor
def consultar(cursor):
    sql = "SELECT fecha,titulo,tipo_grafica,libreria,titulo_x,valores_x,titulo_y,valores_y,comentarios FROM configuracion_graficas"
    try:
        cursor.execute(sql)
        graficas = cursor.fetchall()
    except mysql.connector.errors.Error as err:
        showMessage("Error", str(err))
    except:
        _error = "Error al consultar los registros, asegurese de tener bien configurada la base de datos."
        showMessage("ERROR", f"{_error}")
    else:
        return graficas
def conectar(db):
    try:
        my_db = mysql.connector.connect(host="localhost",
                                        user="******",
                                        password="******",
                                        database=db)
    except mysql.connector.errors.Error as err:
        showMessage("Error", str(err))
    except:
        _error = "Error al intentar conectarse con la base de datos. Favor de verificar los parametros de conexion con la base de datos."
        showMessage("ERROR", f"{_error}")
    else:
        return my_db
    def guardar_datos(self):

        titulo = configuracion_tabla[0]
        titulo_x = configuracion_tabla[1]
        valores_x = configuracion_tabla[3][0]
        titulo_y = configuracion_tabla[2]
        valores_y = configuracion_tabla[3][1]
        valores_y = valores_y
        tipo_grafica = configuracion_tabla[4]
        libreria = configuracion_tabla[5]
        comentarios = self.guardar.ui.ipt_comentarios.toPlainText()
        fecha = datetime.now()
        guardar = False
        print(len(comentarios))

        if len(comentarios) == 0:
            continuar = showdialog(
                "Error", "No se agregaran comentarios. ¿Desea Guardar?")
            if continuar == 1024:
                guardar = True
            else:
                guardar = False
        else:
            if len(comentarios) < 250:

                guardar = True
            else:
                showMessage("Error","No puede tener una longitud de mas de 250 caracteres el texto de comentarios\n"\
                            f"Usted introdujo {len(comentarios)}")

        if guardar:
            try:

                conexion = conectar(bd)
                cursor = _cursor(conexion)
                insertar(conexion, cursor, titulo, titulo_x, valores_x,
                         titulo_y, valores_y, tipo_grafica, libreria,
                         comentarios, fecha)
                desconectar(conexion)
            except:
                pass
            else:
                self.guardar.close()
                plt.close()
                self.clean()
def crear_base_datos(db):
    try:
        my_db = mysql.connector.connect(host="localhost",
                                        user="******",
                                        password="******")
        cursor = _cursor(my_db)
        cursor.execute(f"CREATE DATABASE {db};")
        cursor.execute(f"USE {db};")
        cursor.execute("""
                CREATE TABLE configuracion_graficas(
                            id int primary key NOT NULL AUTO_INCREMENT,
                            titulo varchar(70) DEFAULT NULL,
                           titulo_x varchar(50) DEFAULT NULL,
                           valores_x text,
                           titulo_y varchar(50) DEFAULT NULL,
                           valores_y text,
                           tipo_grafica varchar(10) DEFAULT NULL,
                           libreria varchar(10) DEFAULT NULL,
                           comentarios varchar(250) DEFAULT NULL,
                           fecha datetime DEFAULT NULL


                );


            """)
        my_db.close()

    except mysql.connector.errors.Error as err:

        error = str(err)
        if error == "1007 (HY000): Can't create database 'graficas'; database exists":
            try:
                database = conectar(db)
                cursor = _cursor(database)
                insertar(database, cursor, "Hola", "c", "ca", "dj", "kdd",
                         "fdj", "df", "fd", "2015-12-11 00:00:00")

            except:
                showMessage(
                    "Error",
                    "La base de datos no coincide con la tabla que necesita el programa\nTal Vez tiene el nombre igual a una de sus bases de datos pasada, si es así, cambie el nombre"
                )
            else:
                eliminar(database, cursor, "2015-12-11 00:00:00")
            finally:
                database.close()
        else:
            showMessage("Error", str(err))
    except:
        showMessage(
            "Error",
            "Ha ocurrido un error desconocido al intentar crear la base de datos, favor de verificar parametros de conexion"
        )
def eliminar(conexion, cursor, criterio):
    valores = (criterio, )
    sql = "DELETE FROM configuracion_graficas WHERE fecha=%s"
    try:
        cursor.execute(sql, valores)
        conexion.commit()
    except mysql.connector.errors.Error as err:
        showMessage("Error", str(err))
    except:
        _error = "Error al intentar eliminar los registros, asegurese de tener bien configurada la base de datos."
        showMessage("ERROR", f"{_error}")

    else:
        if criterio != "2015-12-11 00:00:00":

            _exito = "Configuración borrada correctamente."
            showMessage("ERROR", f"{_exito}")
    def generar_grafica(self):
        global configuracion_tabla
        global valores
        global nombre_grafica

        if len(configuracion_tabla) == 6:
            #guardamos la configuracion en un diccionario
            diccionario_configuracion = {
                "Titulo gráfica": configuracion_tabla[0],
                "Titulo X": configuracion_tabla[1],
                "Valores X": configuracion_tabla[3][0],
                "Titulo Y": configuracion_tabla[2],
                "Valores Y": configuracion_tabla[3][1],
                "Tipo de gráfica": configuracion_tabla[4],
                "Librería": configuracion_tabla[5]
            }
            #print(diccionario_configuracion)
            #mandamos ensaje para ver si el usuario quiere generar la grafica
            if len(configuracion_tabla[3][0]) > 1:

                generar = showdialog(
                    "ATENCION",
                    "¿DESEA GENERAR LA GRÁFICA CON LA CONFIGURACIÓN ELEGIDA?")
                # si elige si
                if generar == 1024:
                    # cerramos graficas anteriores
                    try:
                        plt.close()
                        self.guardar.close()
                    except:
                        pass
                    # vaciamos el nombre de la grafica que eligio para imprimirlo en la pantalla de comentarios
                    nombre_grafica = configuracion_tabla[0]
                    # dependiendo la libreria se genera la grafica

                    #matplotlib
                    if diccionario_configuracion["Librería"].upper(
                    ) == "MATPLOTLIB":
                        print("Matplot")
                        if diccionario_configuracion["Tipo de gráfica"].upper(
                        ) == "BARRA":
                            fig, ax = plt.subplots(1, figsize=(8, 6))
                            ax.set_title(
                                diccionario_configuracion['Titulo gráfica'],
                                fontsize=16)
                            ax.bar(diccionario_configuracion['Valores X'],
                                   diccionario_configuracion['Valores Y'],
                                   edgecolor='black')
                            ax.set_xlabel(
                                diccionario_configuracion['Titulo X'])
                            ax.set_ylabel(
                                diccionario_configuracion['Titulo Y'])
                            fig.legend(
                                [ax],  # List of the line objects
                                labels=[diccionario_configuracion['Titulo Y']
                                        ],  # The labels for each line
                                loc="center right",  # Position of the legend
                                borderaxespad=
                                0.1,  # Add little spacing around the legend box
                                title="Leyenda")  # Title for the legend
                            rects = ax.patches
                            labels = [
                                "%d" % i
                                for i in diccionario_configuracion['Valores Y']
                            ]
                            print(labels)
                            for rect, label in zip(rects, labels):
                                height = rect.get_height()
                                ax.text(rect.get_x() + rect.get_width() / 2,
                                        height + 1,
                                        label,
                                        ha='center',
                                        va='bottom')
                            plt.subplots_adjust(right=0.85)
                            plt.show()

                            self.guardar_ui()
                        if diccionario_configuracion["Tipo de gráfica"].upper(
                        ) == "LÍNEA":
                            print("Hola")
                            fig, ax = plt.subplots(1, figsize=(8, 6))
                            fig.suptitle(
                                diccionario_configuracion['Titulo gráfica'],
                                fontsize=15)
                            ax.plot(
                                diccionario_configuracion['Valores X'],
                                diccionario_configuracion['Valores Y'],
                                "-o",
                                linestyle="dashed",
                                label=diccionario_configuracion['Titulo Y'])
                            ax.set_xlabel(
                                diccionario_configuracion['Titulo X'])
                            ax.set_ylabel(
                                diccionario_configuracion['Titulo Y'])
                            ax.legend(loc="upper right",
                                      title="Leyenda",
                                      frameon=False)
                            plt.show()
                            self.guardar_ui()
                        if diccionario_configuracion["Tipo de gráfica"].upper(
                        ) == "PÍE":
                            showMessage(
                                "INFO",
                                "Titulo de X e Y no aplican para esta gráfica, se omitirán."
                            )
                            plt.pie(
                                diccionario_configuracion['Valores Y'],
                                labels=diccionario_configuracion['Valores X'],
                                autopct='%1.1f%%',
                                shadow=True,
                                startangle=90)
                            plt.title(
                                diccionario_configuracion['Titulo gráfica'])
                            plt.show()
                            self.guardar_ui()

                    #seaborn
                    elif configuracion_tabla[-1].upper() == "SEABORN":
                        if diccionario_configuracion["Tipo de gráfica"].upper(
                        ) == "BARRA":
                            data = {
                                diccionario_configuracion['Titulo X']:
                                diccionario_configuracion['Valores X'],
                                diccionario_configuracion['Titulo Y']:
                                diccionario_configuracion['Valores Y']
                            }

                            sns.set_theme(style="darkgrid")

                            sns.barplot(
                                x=diccionario_configuracion['Titulo X'],
                                y=diccionario_configuracion['Titulo Y'],
                                data=data)

                            plt.title(
                                diccionario_configuracion['Titulo gráfica'])
                            plt.show()
                            self.guardar_ui()
                        if diccionario_configuracion["Tipo de gráfica"].upper(
                        ) == "LÍNEA":
                            data = {
                                diccionario_configuracion['Titulo X']:
                                diccionario_configuracion['Valores X'],
                                diccionario_configuracion['Titulo Y']:
                                diccionario_configuracion['Valores Y']
                            }
                            sns.set_theme(style="darkgrid")
                            sns.lineplot(
                                x=diccionario_configuracion['Titulo X'],
                                y=diccionario_configuracion['Titulo Y'],
                                data=data,
                                marker="o")
                            plt.title(
                                diccionario_configuracion['Titulo gráfica'])
                            plt.show()
                            self.guardar_ui()

                        if diccionario_configuracion["Tipo de gráfica"].upper(
                        ) == "PÍE":
                            showMessage(
                                "INFO",
                                "Titulo de X e Y no aplican para esta gráfica, se omitirán."
                            )
                            sns.set_theme(style="darkgrid")
                            plt.pie(
                                diccionario_configuracion['Valores Y'],
                                labels=diccionario_configuracion['Valores X'],
                                autopct='%1.1f%%',
                                shadow=True,
                                startangle=90)
                            plt.title(
                                diccionario_configuracion['Titulo gráfica'])
                            plt.show()
                            self.guardar_ui()
            else:
                showMessage(
                    "Error",
                    "No es posible generar una grafica de un solo valor")

        else:
            showMessage("Error",
                        "No se han capturado los valores por completo.")
            configuracion_tabla.pop(5)
            configuracion_tabla.pop(4)
    def validar(self):
        global configuracion_tabla
        global valores
        valores = []
        configuracion_tabla = []
        x = list()
        y = list()
        c_tipo = 0
        c_libreria = 0
        grafica = ""
        libreria = ""
        avanzar = False

        for i in self.ui.rb_group_tipo.buttons():
            if i.isChecked():
                grafica = grafica + i.text()
                c_tipo = +1
                break
        for i in self.ui.rb_group_libreria.buttons():
            if i.isChecked():
                libreria = libreria + i.text()
                c_libreria = +1
                break
        if c_tipo == 1 and c_libreria == 1:
            avanzar = True
        elif c_tipo == 0:
            showMessage("Error", "No se ha elegido el tipo de tabla.")
        elif c_libreria == 0:
            showMessage("Error", "No se ha elegido la libreria.")

        if avanzar:
            titulo = self.ui.ipt_titulo_grafica.text()
            x_titulo = self.ui.ipt_eje_x.text()
            y_titulo = self.ui.ipt_eje_y.text()
            n = self.ui.tw_datos.rowCount()

            if len(titulo.replace(" ", "")) > 0:
                avanzar = True
            else:
                avanzar = False
                showMessage(
                    "Error",
                    "Debe capturar el titulo de la gráfica correctamente")
        else:
            showMessage("Error", "No se ha elegido el tipo de libreria.")
        if avanzar:
            if grafica != "PÍE":

                if len(x_titulo.replace(" ", "")) > 0:
                    avanzar = True
                else:
                    avanzar = False
                    showMessage("Error",
                                "Debe capturar el titulo de X correctamente.")
                if len(y_titulo.replace(" ", "")) > 0:
                    avanzar = True
                else:
                    avanzar = False
                    showMessage("Error",
                                "Debe capturar el titulo de Y correctamente.")
            else:
                x_titulo = "No aplica"
                y_titulo = "No aplica"
        if avanzar:
            celdas_vacias = 0
            celdas_ocupadas = 0
            for i in range(n):
                _x = self.ui.tw_datos.item(i, 0).text()
                _y = self.ui.tw_datos.item(i, 1).text()
                if len(_x.replace(" ", "")) > 0 and (es_flotante(_y)
                                                     or es_entero(_y)):
                    if celdas_vacias == 1:
                        showMessage(
                            "Error",
                            "Hay lugares sin llenar,Recuerde que los registros deben ser seguidos."
                        )
                        avanzar = False
                        x = []
                        y = []
                        break
                    else:

                        x.append(_x)
                        y.append(float(_y))
                        celdas_ocupadas = celdas_ocupadas + 1

                elif (len(_x.replace(" ", "")) == 0
                      and (es_flotante(_y) or es_entero(_y))):
                    showMessage(
                        "Error",
                        f"Valor de la columna X de la fila {i + 1} sin llenar")
                    avanzar = False
                    break
                elif (len(_x.replace(" ", "")) > 0 and
                      (es_flotante(_y) == False and es_entero(_y) == False)):
                    showMessage(
                        "Error",
                        f"Valor de la columna Y de la fila {i + 1} no valido")
                    avanzar = False
                    break
                elif (len(_x.replace(" ", "")) > 0
                      and len(_y.replace(" ", "")) == 0):
                    showMessage(
                        "Error",
                        f"Valor de la columna Y de la fila {i + 1} no ingresado"
                    )
                    avanzar = False
                    break
                elif len(_x.replace(" ", "")) == 0 and len(_y.replace(
                        " ", "")) == 0:
                    celdas_vacias = +1

            avanzar_tabla = False
            print(celdas_ocupadas)
            if celdas_ocupadas >= 1:
                valores.append(x)
                valores.append(y)
                avanzar_tabla = True
            elif celdas_ocupadas < 1:
                showMessage("Error", "No hay valores capturados.")
                avanzar = False
        #si todo es correcto lo añadimos a configuracion_tabla
        if avanzar and avanzar_tabla:
            configuracion_tabla.append(titulo)
            configuracion_tabla.append(x_titulo)
            configuracion_tabla.append(y_titulo)
            configuracion_tabla.append(valores)
            configuracion_tabla.append(grafica)
            configuracion_tabla.append(libreria)
            #llamamos a generar grafica para que valide la configuracion una vez mas y genere la tabla
            self.generar_grafica()