GraphVisualizer Python GUI

👤 Sharing: AI
import tkinter as tk
from tkinter import ttk
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import json

class GraphVisualizerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Graph Visualizer")

        self.graph = nx.Graph()

        # UI Elements
        self.node1_label = ttk.Label(root, text="Node 1:")
        self.node1_label.grid(row=0, column=0, padx=5, pady=5, sticky="e")
        self.node1_entry = ttk.Entry(root)
        self.node1_entry.grid(row=0, column=1, padx=5, pady=5, sticky="w")

        self.node2_label = ttk.Label(root, text="Node 2:")
        self.node2_label.grid(row=1, column=0, padx=5, pady=5, sticky="e")
        self.node2_entry = ttk.Entry(root)
        self.node2_entry.grid(row=1, column=1, padx=5, pady=5, sticky="w")

        self.add_edge_button = ttk.Button(root, text="Add Edge", command=self.add_edge)
        self.add_edge_button.grid(row=2, column=0, columnspan=2, padx=5, pady=5)

        self.clear_graph_button = ttk.Button(root, text="Clear Graph", command=self.clear_graph)
        self.clear_graph_button.grid(row=3, column=0, columnspan=2, padx=5, pady=5)

        self.load_button = ttk.Button(root, text="Load Graph (JSON)", command=self.load_graph)
        self.load_button.grid(row=4, column=0, columnspan=2, padx=5, pady=5)

        self.save_button = ttk.Button(root, text="Save Graph (JSON)", command=self.save_graph)
        self.save_button.grid(row=5, column=0, columnspan=2, padx=5, pady=5)

        # Graph Visualization Area
        self.fig, self.ax = plt.subplots(figsize=(6, 4), dpi=100)
        self.canvas = FigureCanvasTkAgg(self.fig, master=root)
        self.canvas_widget = self.canvas.get_tk_widget()
        self.canvas_widget.grid(row=0, column=2, rowspan=6, padx=10, pady=10)

        self.details_button = ttk.Button(root, text="Details", command=self.show_details)
        self.details_button.grid(row=6, column=0, columnspan=2, padx=5, pady=5)

        self.draw_graph()

    def add_edge(self):
        node1 = self.node1_entry.get()
        node2 = self.node2_entry.get()
        if node1 and node2:
            self.graph.add_edge(node1, node2)
            self.draw_graph()

    def clear_graph(self):
        self.graph.clear()
        self.draw_graph()

    def draw_graph(self):
        self.ax.clear()
        if self.graph.number_of_nodes() > 0:
            pos = nx.spring_layout(self.graph)
            nx.draw(self.graph, pos, ax=self.ax, with_labels=True, node_size=800, node_color="skyblue", font_size=10, font_weight="bold")
            self.ax.set_title("Graph Visualization")
        else:
            self.ax.text(0.5, 0.5, "No graph data. Add edges or load a JSON file.", ha="center", va="center")
        self.canvas.draw()

    def load_graph(self):
        try:
            filename = tk.filedialog.askopenfilename(defaultextension=".json", filetypes=[("JSON files", "*.json")])
            if filename:
                with open(filename, 'r') as f:
                    data = json.load(f)
                    self.graph = nx.node_link_graph(data)
                self.draw_graph()
        except Exception as e:
            tk.messagebox.showerror("Error", f"Failed to load graph: {e}")

    def save_graph(self):
        try:
            filename = tk.filedialog.asksaveasfilename(defaultextension=".json", filetypes=[("JSON files", "*.json")])
            if filename:
                data = nx.node_link_data(self.graph)
                with open(filename, 'w') as f:
                    json.dump(data, f, indent=4)
                tk.messagebox.showinfo("Success", "Graph saved successfully!")
        except Exception as e:
            tk.messagebox.showerror("Error", f"Failed to save graph: {e}")

    def show_details(self):
        details_text = """
        Graph Visualizer: A versatile application for creating, visualizing, and analyzing graphs.

        Features:
        - Add Edges: Connect nodes by specifying their names.
        - Clear Graph: Remove all nodes and edges from the graph.
        - Load Graph: Import graph data from a JSON file.
        - Save Graph: Export the current graph to a JSON file.

        The graph is dynamically displayed and can be customized.  The layout is generated using a spring layout algorithm.

        This application can be used for network analysis, relationship mapping, or any scenario where visual representation of interconnected data is beneficial.
        """
        tk.messagebox.showinfo("Details", details_text)


if __name__ == "__main__":
    root = tk.Tk()
    app = GraphVisualizerApp(root)
    root.mainloop()
👁️ Viewed: 7

Comments