Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pandas as pd | |
# Data store for subjects | |
subject_data = [] | |
# Utility to scale marks from input total to given weight | |
def scale(raw_marks, weight): | |
return (raw_marks / 100) * weight | |
# Grade logic | |
def get_grade_point(total): | |
if 90 <= total <= 100: | |
return 10, "S" | |
elif 80 <= total < 90: | |
return 9, "A" | |
elif 70 <= total < 80: | |
return 8, "B" | |
elif 60 <= total < 70: | |
return 7, "C" | |
elif 50 <= total < 60: | |
return 6, "D" | |
elif 40 <= total < 50: | |
return 5, "E" | |
else: | |
return 0, "F" | |
# Add subject and calculate its grade | |
def add_subject(sub_type, s1, s2, mid=0, lab=0, prac=0, theory=0, open_proj=0, end_sem=0): | |
s1_scaled = scale(s1 * 2, 17.5) | |
s2_scaled = scale(s2 * 2, 17.5) | |
if sub_type == "With Practical": | |
mid_scaled = scale(mid, 10) | |
lab_scaled = scale(lab, 5) | |
prac_scaled = scale(prac, 15) | |
theory_scaled = scale(theory, 35) | |
total = s1_scaled + s2_scaled + mid_scaled + lab_scaled + prac_scaled + theory_scaled | |
else: | |
proj_scaled = scale(open_proj, 15) | |
end_scaled = scale(end_sem, 50) | |
total = s1_scaled + s2_scaled + proj_scaled + end_scaled | |
grade_point, grade = get_grade_point(total) | |
subject_data.append({ | |
"Type": sub_type, | |
"Total Marks": round(total, 2), | |
"Grade": grade, | |
"Points": grade_point | |
}) | |
return ( | |
f"β Subject Added: {sub_type} | Total: {round(total, 2)} | Grade: {grade}", | |
pd.DataFrame(subject_data) | |
) | |
# GPA calculation | |
def calculate_gpa(): | |
if not subject_data: | |
return "β οΈ No subjects added yet." | |
total_points = sum(s["Points"] for s in subject_data) | |
gpa = round(total_points / len(subject_data), 2) | |
return f"π Semester GPA: {gpa}" | |
# Reset all data | |
def clear_data(): | |
subject_data.clear() | |
return "π§Ή All subjects cleared!", pd.DataFrame(subject_data) | |
# CGPA calculation | |
def calculate_cgpa(current_cgpa, current_semesters, new_sem_gpa): | |
try: | |
current_total = current_cgpa * current_semesters | |
new_total = current_total + new_sem_gpa | |
new_cgpa = round(new_total / (current_semesters + 1), 2) | |
return f"π Updated CGPA after this semester: {new_cgpa}" | |
except Exception: | |
return "β Error in CGPA Calculation. Please check inputs." | |
# Show/hide fields dynamically | |
def toggle_fields(subject_type): | |
show_practical = subject_type == "With Practical" | |
show_theory = subject_type == "Without Practical" | |
return ( | |
gr.update(visible=show_practical), # mid | |
gr.update(visible=show_practical), # lab | |
gr.update(visible=show_practical), # prac | |
gr.update(visible=show_practical), # theory | |
gr.update(visible=show_theory), # open_proj | |
gr.update(visible=show_theory) # end_sem | |
) | |
# Gradio UI | |
with gr.Blocks(title="GPA & CGPA Calculator") as demo: | |
gr.Markdown(""" | |
# π GPA & CGPA Calculator | |
### π Instructions: | |
- Select the subject type (With Practical / Without Practical). | |
- Enter marks: | |
- **Sessionals**: out of 50 β scaled to 17.5 | |
- **Practicals/Lab/Project**: out of 100 β auto scaled | |
- **End Sem**: out of 100 β scaled to 35 or 50 | |
- β **Add Subject** for each subject. | |
- β **Calculate GPA** to see semester GPA. | |
- π **Calculate CGPA** to include this sem into your cumulative GPA. | |
""") | |
subject_type = gr.Dropdown(["With Practical", "Without Practical"], label="Subject Type", value="With Practical") | |
with gr.Column(): | |
s1 = gr.Number(label="Sessional-I (out of 50)", value=0) | |
s2 = gr.Number(label="Sessional-II (out of 50)", value=0) | |
mid = gr.Number(label="Mid-Sem Practical (out of 100)", value=0, visible=True) | |
lab = gr.Number(label="Regular Lab Performance (out of 100)", value=0, visible=True) | |
prac = gr.Number(label="End Sem Practical (out of 100)", value=0, visible=True) | |
theory = gr.Number(label="End Sem Theory (out of 100)", value=0, visible=True) | |
open_proj = gr.Number(label="Open-ended Project (out of 100)", value=0, visible=False) | |
end_sem = gr.Number(label="End Sem Theory (out of 100)", value=0, visible=False) | |
subject_type.change( | |
fn=toggle_fields, | |
inputs=[subject_type], | |
outputs=[mid, lab, prac, theory, open_proj, end_sem] | |
) | |
submit_btn = gr.Button("β Add Subject") | |
result = gr.Textbox(label="Status", interactive=False) | |
subject_table = gr.Dataframe(label="π Subjects Added", interactive=False) | |
submit_btn.click( | |
fn=add_subject, | |
inputs=[subject_type, s1, s2, mid, lab, prac, theory, open_proj, end_sem], | |
outputs=[result, subject_table] | |
) | |
with gr.Row(): | |
calc_btn = gr.Button("β Calculate GPA") | |
clear_btn = gr.Button("π§Ή Clear All") | |
gpa_out = gr.Textbox(label="π Semester GPA", interactive=False) | |
calc_btn.click(fn=calculate_gpa, inputs=[], outputs=[gpa_out]) | |
clear_btn.click(fn=clear_data, inputs=[], outputs=[result, subject_table]) | |
gr.Markdown("---") | |
gr.Markdown("## π― Cumulative CGPA Calculator (Till Current Semester)") | |
with gr.Row(): | |
prev_cgpa = gr.Number(label="Current CGPA (till last semester)", value=0) | |
prev_sems = gr.Number(label="Number of completed semesters", value=0) | |
current_gpa = gr.Number(label="This Semester GPA (enter manually or copy from above)", value=0) | |
cgpa_btn = gr.Button("π Calculate Updated CGPA") | |
cgpa_out = gr.Textbox(label="π Final CGPA", interactive=False) | |
cgpa_btn.click(fn=calculate_cgpa, inputs=[prev_cgpa, prev_sems, current_gpa], outputs=[cgpa_out]) | |
demo.launch() | |