1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| import tkinter as tk from tkinter import filedialog
def GPA(list): sum_credit = 0 sum_credit_ = 0 sum_ave = 0 sum_ave_ = 0 sum_gpa = 0 for sub in list: credit = sub[1] score = sub[2] op = sub[3] gpa = 4.0 - (100 - score) ** 2 * 3.0 / 1600.0 if score < 60: gpa = 0 elif score == 60: gpa = 1.0 sum_gpa += gpa * credit if op == 1: sum_ave_ += score * credit sum_credit_ += credit sum_ave += score * credit sum_credit += credit gpa = sum_gpa / sum_credit ave = sum_ave / sum_credit ave_ = sum_ave_ / sum_credit_ if sum_credit_ != 0 else 0 return [gpa, ave, ave_]
def open_file(): global term_text, sum_data_labels, term_labels filepath = filedialog.askopenfilename( title="选择文件", filetypes=(("Text files", "*.txt"), ("All files", "*.*")) ) subject = [] term = [[] for _ in range(10)] count = 0 if not filepath: return with open(filepath, encoding='utf-8', mode='r') as f: while True: line = f.readline().strip() print(line,end='\n') if not line: break items = line.split() if len(items) == 1: count += 1 elif len(items) == 4: this_name, this_credit, this_score, this_op = items subject.append([this_name, float(this_credit), float(this_score), int(this_op)]) term[count].append([this_name, float(this_credit), float(this_score), int(this_op)]) else: print("读取完毕") return sum_data = GPA(subject) Term = [GPA(term[i+1]) for i in range(count)]
term_text.delete('1.0', tk.END) for i, term in enumerate(Term): term_text.insert(tk.END, f"Term {i + 1}: GPA={term[0]:.4f}, 全部课加权平均={term[1]:.4f},必修课加权平均={term[2]:.4f}\n")
sum_data_labels[0]['text'] = f"所有学期GPA: {sum_data[0]:.4f}" sum_data_labels[1]['text'] = f"所有学期所有课程加权平均: {sum_data[1]:.4f}" sum_data_labels[2]['text'] = f"所有学期必修课程加权平均: {sum_data[2]:.4f}"
def create_gui(): root = tk.Tk() root.title("GPA Calculator")
button = tk.Button(root, text="Open File", command=open_file) button.pack()
global term_text term_text = tk.Text(root, wrap=tk.WORD) term_text.pack(expand=True, fill=tk.BOTH)
global sum_data_labels sum_data_labels = [ tk.Label(root, text="Total GPA:"), tk.Label(root, text="Total Average:"), tk.Label(root, text="Required Average:") ] for label in sum_data_labels: label.pack()
root.mainloop()
if __name__ == '__main__': create_gui()
|