import tkinter as tk from tkinter import filedialog, ttk import pandas as pd import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg class Homepage(tk.Frame): def __init__(self, parent, controller): super().__init__(parent) self.controller = controller self.sidebar = tk.Frame(self, bg='#2c3e50', width=220, height=800) self.sidebar.pack(side=tk.LEFT, fill=tk.Y) self.home_btn = tk.Button(self.sidebar, text="Homepage", command=lambda: controller.show_frame("Homepage"), bg='#3498db', font=("Arial", 12)) self.home_btn.pack(pady=10, padx=10, fill=tk.X) self.upload_btn = tk.Button(self.sidebar, text="Upload CSV", command=lambda: controller.show_frame("UploadPage"), bg='#27ae60', font=("Arial", 12)) self.upload_btn.pack(pady=10, padx=10, fill=tk.X) self.main_frame = tk.Frame(self, bg='white', width=980, height=800) self.main_frame.pack(fill="both", expand=True) self.data = None self.show_homepage() def show_homepage(self): for widget in self.main_frame.winfo_children(): widget.destroy() tk.Label(self.main_frame, text="Patient Referral Dashboard", font=("Arial", 20), bg='white').pack(pady=10) try: self.data = pd.read_csv("data.csv") self.generate_charts() except (FileNotFoundError, pd.errors.EmptyDataError): tk.Label(self.main_frame, text="No data available. Please upload data in the Upload Data page.", font=("Arial", 14), bg='white').pack(pady=20) def generate_charts(self): """Generate and display charts only if data is available.""" if self.data is None or self.data.empty: return total_patients = len(self.data) referral_patients = self.data['referral'].sum() non_referral_patients = total_patients - referral_patients fig, axes = plt.subplots(1, 2, figsize=(14, 6)) labels = ['Need Referral', 'Do Not Need Referral'] sizes = [referral_patients, non_referral_patients] axes[0].pie(sizes, labels=labels, autopct='%1.1f%%', startangle=100, colors=['#66c2a5', '#fc8d62']) axes[0].set_title("Patient Referral Distribution", fontsize=16) average_data = self.data.drop(columns=['encounterId', 'referral']).mean() axes[1].bar(average_data.index, average_data.values, color='#1f77b4', width=0.4) axes[1].set_xticklabels(average_data.index, rotation=45, ha='right', fontsize=10) axes[1].set_title("Average Patient Data", fontsize=14) plt.tight_layout() canvas = FigureCanvasTkAgg(fig, master=self.main_frame) canvas.draw() canvas.get_tk_widget().pack(pady=10) def show_data(self): """Display the uploaded CSV data in a table format.""" for widget in self.main_frame.winfo_children(): widget.destroy() if self.data is not None: tree = ttk.Treeview(self.main_frame) tree['columns'] = tuple(self.data.columns) for col in self.data.columns: tree.heading(col, text=col) tree.column(col, width=100) for index, row in self.data.iterrows(): tree.insert("", "end", values=tuple(row)) tree.pack(fill=tk.BOTH, expand=True) else: tk.Label(self.main_frame, text="No Data Available", font=("Arial", 14), bg='white').pack(pady=20) def on_closing(self): """Delete data.csv when the dashboard is closed.""" if os.path.exists("data.csv"): os.remove("data.csv") self.root.destroy()