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