import gradio as gr import pandas as pd # Grade to grade point mapping grade_points = { "A": 4.0, "A-": 3.7, "B+": 3.3, "B": 3.0, "B-": 2.7, "C+": 2.3, "C": 2.0, "C-": 1.7, "D+": 1.3, "D": 1.0, "F": 0.0 } def calculate_gpa(subjects, prev_credits=0, prev_gpa=0): if not subjects: return 0, 0 df = pd.DataFrame(subjects) df['Points'] = df['Grade'].map(grade_points) * df['Credit'] current_points = df['Points'].sum() current_credits = df['Credit'].sum() current_gpa = round(current_points / current_credits, 2) if current_credits > 0 else 0 if prev_credits > 0: total_credits = prev_credits + current_credits cgpa = round((prev_gpa * prev_credits + current_points) / total_credits, 2) else: cgpa = current_gpa return current_gpa, cgpa with gr.Blocks(title="GPA Calculator") as demo: gr.Markdown("# 📊 GPA/CGPA Calculator") with gr.Row(): with gr.Column(): subject = gr.Textbox(label="Subject Name") grade = gr.Dropdown(list(grade_points.keys()), label="Grade") credit = gr.Number(3.0, label="Credit Hours", minimum=0.5, step=0.5) add_btn = gr.Button("Add Subject") with gr.Column(): subjects_table = gr.Dataframe(headers=["Subject", "Grade", "Credit"]) clear_btn = gr.Button("Clear All") with gr.Accordion("Previous Semester Data (Optional)", open=False): prev_credits = gr.Number(0, label="Previous Total Credits") prev_gpa = gr.Number(0, label="Previous GPA", minimum=0, maximum=4.0) calculate_btn = gr.Button("Calculate GPA") with gr.Row(): current_gpa = gr.Number(label="Current Semester GPA") overall_cgpa = gr.Number(label="Overall CGPA") subjects = gr.State([]) def add_subject(subject, grade, credit, existing_subjects): new_subject = {"Subject": subject, "Grade": grade, "Credit": credit} return existing_subjects + [new_subject], pd.DataFrame(existing_subjects + [new_subject]) add_btn.click( add_subject, inputs=[subject, grade, credit, subjects], outputs=[subjects, subjects_table] ) clear_btn.click( lambda: ([], pd.DataFrame(columns=["Subject", "Grade", "Credit"])), outputs=[subjects, subjects_table] ) calculate_btn.click( calculate_gpa, inputs=[subjects, prev_credits, prev_gpa], outputs=[current_gpa, overall_cgpa] ) demo.launch()