Smart Hospital Patient Record and Data
Management System(Final GUI Project)
Developed By: Kowstub
Class: XII
Subject: Informatics Practices
1. Introduction
This project is developed to manage patient records and hospital data efficiently using a
graphical user interface, MySQL database, and data visualization tools. It supports easy CRUD
operations and generates useful insights through charts.
2. Requirements
● Python 3.2
● Tkinter module for GUI
● mysql-connector-python for DB connection
● Pandas and Matplotlib for charting
● MySQL Database Setup
import tkinter as tk
from tkinter import ttk, messagebox
import [Link]
import pandas as pd
import [Link] as plt
# Database connection and setup
def connectdb():
try:
conn = [Link](
host="localhost", # Your MySQL host
user="root", # Your MySQL username
password="password", # Your MySQL password
database="hospital" # Your database name
)
return conn
except [Link] as err:
[Link]("Connection Error", f"Could not connect to MySQL
Database!\n{err}")
return None
def createtable():
conn = connectdb()
if conn:
cursor = [Link]()
[Link]("""
CREATE TABLE IF NOT EXISTS patients (
PatientID INT PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(100),
Age INT,
Gender VARCHAR(10),
Disease VARCHAR(200)
);
""")
[Link]()
[Link]()
# Functionalities
def addrecord():
name = [Link]()
age = [Link]()
gender = [Link]()
disease = [Link]()
if not (name and age and gender and disease):
[Link]("Input Error", "Please fill all fields!")
return
conn = connectdb()
if conn:
cursor = [Link]()
query = "INSERT INTO patients (Name, Age, Gender, Disease) VALUES (%s, %s, %s,
%s)"
try:
[Link](query, (name, age, gender, disease))
[Link]()
[Link]("Success", "Patient record added successfully!")
clearentries()
viewrecords()
except Exception as e:
[Link]("Error", f"Failed to add record: {e}")
finally:
[Link]()
def viewrecords():
for row in table.get_children():
[Link](row)
conn = connectdb()
if conn:
cursor = [Link]()
[Link]("SELECT * FROM patients")
rows = [Link]()
for row in rows:
[Link]('', [Link], values=row)
[Link]()
def searchrecords():
search_val = [Link]()
search_type_val = [Link]()
if not search_val:
[Link]("Input Error", "Please enter a search term!")
return
query = ""
if search_type_val == "Age":
query = "SELECT * FROM patients WHERE Age = %s"
elif search_type_val == "Disease":
query = "SELECT * FROM patients WHERE Disease LIKE %s"
search_val = f"%{search_val}%"
for row in table.get_children():
[Link](row)
conn = connectdb()
if conn:
cursor = [Link]()
[Link](query, (search_val,))
rows = [Link]()
if not rows:
[Link]("No Results", "No matching records found.")
for row in rows:
[Link]('', [Link], values=row)
[Link]()
def clearentries():
[Link](0, [Link])
[Link](0, [Link])
[Link](0, [Link])
[Link](None)
[Link](0, [Link])
def showcharts():
conn = connectdb()
if not conn:
return
df = pd.read_sql("SELECT Gender, COUNT(*) as Count FROM patients GROUP BY
Gender", conn)
[Link]()
if [Link]:
[Link]("No Data", "No records available for analysis!")
return
[Link](figsize=(7,7))
[Link](df['Count'], labels=df['Gender'], autopct='%1.1f%%', startangle=140)
[Link]("Patient Gender Distribution")
[Link]()
# Setup Menu
def setup_menu(root):
menubar = [Link](root)
patient_menu = [Link](menubar, tearoff=0)
patient_menu.add_command(label="Add Patient", command=addrecord)
patient_menu.add_command(label="View All Patients", command=viewrecords)
patient_menu.add_command(label="Search Patients", command=searchrecords)
patient_menu.add_separator()
patient_menu.add_command(label="Clear Fields", command=clearentries)
menubar.add_cascade(label="Patient Management", menu=patient_menu)
viz_menu = [Link](menubar, tearoff=0)
viz_menu.add_command(label="Gender Distribution Chart", command=showcharts)
menubar.add_cascade(label="Data Visualization", menu=viz_menu)
system_menu = [Link](menubar, tearoff=0)
system_menu.add_command(label="Exit", command=[Link])
menubar.add_cascade(label="System", menu=system_menu)
[Link](menu=menubar)
# Initialize Main Window
root = [Link]()
[Link]("Smart Hospital Patient Record and Data Management System")
[Link]("900x600")
[Link](bg="#eaf4ff")
# Title
title = [Link](root, text="Smart Hospital Patient Record and Data Management System",
font=("Arial", 20, "bold"), bg="#004080", fg="white", pady=10)
[Link](fill=tk.X)
# Patient Form Frame
formframe = [Link](root, bg="#eaf4ff")
[Link](pady=10)
[Link](formframe, text="Name:", bg="#eaf4ff").grid(row=0, column=0, padx=10, pady=5,
sticky='e')
nameentry = [Link](formframe)
[Link](row=0, column=1, padx=10, pady=5)
[Link](formframe, text="Age:", bg="#eaf4ff").grid(row=1, column=0, padx=10, pady=5,
sticky='e')
ageentry = [Link](formframe)
[Link](row=1, column=1, padx=10, pady=5)
[Link](formframe, text="Gender:", bg="#eaf4ff").grid(row=2, column=0, padx=10, pady=5,
sticky='e')
gendervar = [Link](value=None)
[Link](formframe, text="Male", variable=gendervar, value="Male",
bg="#eaf4ff").grid(row=2, column=1, sticky='w')
[Link](formframe, text="Female", variable=gendervar, value="Female",
bg="#eaf4ff").grid(row=2, column=2, sticky='w')
[Link](formframe, text="Disease:", bg="#eaf4ff").grid(row=3, column=0, padx=10, pady=5,
sticky='e')
diseaseentry = [Link](formframe)
[Link](row=3, column=1, padx=10, pady=5)
# Search Frame
searchframe = [Link](root, text="Search Patient Records", bg="#eaf4ff", font=("Arial",
12, "bold"))
[Link](padx=20, pady=10, fill=tk.X)
searchtype = [Link](value="Age")
[Link](searchframe, text="Age", variable=searchtype, value="Age",
bg="#eaf4ff").pack(side=[Link], padx=10)
[Link](searchframe, text="Disease", variable=searchtype, value="Disease",
bg="#eaf4ff").pack(side=[Link], padx=10)
searchentry = [Link](searchframe, width=40)
[Link](side=[Link], padx=10)
search_button = [Link](searchframe, text="Search", bg="#17a2b8", fg="white", width=15,
command=searchrecords)
search_button.pack(side=[Link], padx=10)
# Table Frame
tableframe = [Link](root)
[Link](padx=20, pady=10, fill=[Link], expand=True)
columns = ("PatientID", "Name", "Age", "Gender", "Disease")
table = [Link](tableframe, columns=columns, show="headings")
for col in columns:
[Link](col, text=col)
[Link](col, anchor=[Link], width=120)
scroll_y = [Link](tableframe, orient=[Link], command=[Link])
[Link](yscrollcommand=scroll_y.set)
scroll_y.pack(side=[Link], fill=tk.Y)
[Link](fill=[Link], expand=True)
# Setup The Menu
setup_menu(root)
# Create Table if Not Exists
createtable()
# Run Main Loop
[Link]()