Package: graphdisplay
GraphDisplayAn intuitive GUI for visualizing graphs💡Resumengraphdisplay es un paquete de python elaborado e ideado por Alberto Penas Díaz, cuya finalidad es facilitar la visualización de grafos y árboles a los alumnos de Estructuras de Datos y Algoritmos.⚡️¿Quieres contribuir?Este es un proyecto de código abierto hecho por y para estudiantes así que cualquier ayuda, comentario o sugerencia es bienvenido. La mejor manera de contribuir es añadir los bugs que os encontréis
en el apartado de Issues pero también estoy completamente abierto a responder cualquier duda o ayuda desde mi correo personal (disponible en mi perfil de github). ¡Muchas gracias de antemano!📐Método de usoPara instalar la librería, basta con escribir el siguiente comando en la terminal:pip install graphdisplay, con esta, se instalarán también otras dependencias, ya sean las librerías
tkinter y math (que muchas veces vienen instaladas por defecto en python).Una vez instalado, se debe importar el paquete desde donde se esté trabajando con:from graphdisplay import GraphGUI. La librería también incluye la implementación oficial de grafos y árboles de la
asignatura, por lo que también son importables (from graphdisplay import BinarySearchTree, Graph, GraphGUI, AVLTree).
Una vez instalada, se debe instanciar un grafo o árbol para finalmente introducirlo como argumento al generar un objeto de tipo GraphGUI, el cual mostrará en una ventana el grafo y ofrecerá la posibildad de mover los vértices con el ratón.ES MUY IMPORTANTEque éste parámetro sea implementado en base al código base de la asignatura. Si alguno
de los atributos de las clases cambiase de nombre, es muy probable que el programa no funcionara correctamente. Para más información, consultar elrespositorio oficial de la asignaturao utilizar la implementación de grafos que viene por defecto con el paquete.
Además de una serie de funcionalidades accesibles en la barra superior, ya sean una pestaña de información adicional, otra pestaña de funcionalidades sobre el grafo y un menú desplegable que
gestiona el almacenado de grafos.Dicho esto, algunos ejemplos de uso podrían ser los siguientes:Para representar el siguiente grafo:Se podría disponer del siguiente código:fromgraphdisplayimportGraphGUI,Graph# Implementaremos el grafo de la siguiente imagen:# https://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/CPT-Graphs-directed-weighted-ex1.svg/722px-CPT-Graphs-directed-weighted-ex1.svg.pnglabels=['A','B','C','D','E']g=Graph(labels)g.addEdge('A','C',12)# A->(12)Cg.addEdge('A','D',60)# A->(60)Dg.addEdge('B','A',10)# B->(10)Ag.addEdge('C','B',20)# C->(20)Bg.addEdge('C','D',32)# C->(32)Dg.addEdge('E','A',7)# E->(7)A# Para representar el grafoif__name__=="__main__":GraphGUI(g)Ejemplo con árboles binarios de búsqueda:Para representar el siguiente árbol:Se dispondría del siguiente código:fromgraphdisplayimportGraphGUI,BinarySearchTreelabels=[12,4,16,2,10,14,19,1,8,13,18,20,6,24]tree=BinarySearchTree()foriinlabels:tree.insert(i)# Para representar el árbolif__name__=="__main__":GraphGUI(tree)⚡️FuncionalidadesComo ya se ha mencionado, una de las principales características de la aplicación consiste en la posibilidad de mover los vértices del grafo dentro de la ventana. Además,
éstos conservarán su posición si se cierra la ventana y se vuelve a abrir. Así mismo, es posible abrir varias ventanas al mismo tiempo
instanciando varios objetos de tipo GraphGUI en el mismo programa. Es por esto que el sistema de autoguardado depende de en qué parte del programa se generen estos objetos GraphGUI.
Por ejemplo, si se han generado dos grafos A y B y ha llamado primero al A y luego al B, si se vuelve a ejecutar el programa pero esta vez llamando primero al B, el sistema
tratará de cargar el último estado del grafo A en el B. Para evitar esto, es recomendable generar una guardado permanente (pulsando el botón file>save y nombrando el guardado) para
después poder cargarlo (file>load) en cualquier momento.Cabe destacar además, que las funcionalidades han sido testeadas únicamente en linux y en windows, variando las funcionalidades de la aplicación entre los sitemas. Por ejemplo,
al generar un objeto GraphGUI en windows, si no se ha instanciado dentro de la cláusulaif __name__ == "__main__":saltará unWarning, cosa que no pasará en Linux. Por otra parte,
Windows permite generar sub-árboles presionando con el click derecho del ratón en un vértice (dicho árbol se generará en una nueva ventana), funcionalidad que no está disponible en linux debido al
issue #16🎯Ejemplos de usofromgraphdisplayimportGraphGUI,Graphmy_gragph=Graph(['A','B','C','D','E','F','G','H','I','J','K','L','M','Z','N','O','P','Q'])my_gragph.addEdge('A','B',4)my_gragph.addEdge('B','C',8)my_gragph.addEdge('C','A',100)my_gragph.addEdge('D','E',7)my_gragph.addEdge('E','F',10)my_gragph.addEdge('F','G',5)my_gragph.addEdge('G','Z',6)my_gragph.addEdge('A','H',2)my_gragph.addEdge('B','I',3)my_gragph.addEdge('C','J',4)my_gragph.addEdge('D','K',5)my_gragph.addEdge('E','L',6)my_gragph.addEdge('F','D',3)my_gragph.addEdge('G','H',9)my_gragph.addEdge('H','Z',2)my_gragph.addEdge('I','J',1)my_gragph.addEdge('J','A',6)my_gragph.addEdge('K','L',5)my_gragph.addEdge('L','M',4)my_gragph.addEdge('M','H',3)my_gragph.addEdge('N','O',2)my_gragph.addEdge('O','P',1)my_gragph.addEdge('P','Q',7)my_gragph.addEdge('H','A',20)my_gragph.addEdge('K','B',7)my_gragph.addEdge('H','N',9)my_gragph.addEdge('Q','D',40)if__name__=="__main__":GraphGUI(g)Y nos mostrará la ventana (reordenando los vértices):De la misma manera, un ejemplo de display de un árbol binario de búsqueda: