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()