python學生成績管理系統【完整版】
✅作者簡介:大家好我是hacker707,大家可以叫我hacker,新星計劃第三季python賽道Top1?
?個人主頁:hacker707的csdn部落格
?系列專欄:python
?推薦一款模擬面試、刷題神器?點選跳轉進入網站
學生成績管理系統簡介
一個帶有登入介面具有增減改查功能的學生成績管理系統(物件導向思想,利用tkinter庫進行製作,利用.txt檔案進行儲存資料)
原始碼?
✅僅供學習參考,最好還是自己多敲多練習(實踐是檢驗真理的唯一標準)
students.txt
用於儲存資料
main.py
from tkinter import *
from Login import *
import tkinter as tk
root = tk.Tk()
root.title('歡迎進入學生成績管理系統')
LoginPage(root)
root.mainloop()
Login.py
from tkinter import *
from tkinter.messagebox import *
from MenuPage import *
class LoginPage(object):
def __init__(self, master=None):
self.root = master # 定義內部變數root
self.root.geometry('%dx%d' % (300, 180)) # 設定視窗大小
self.username = StringVar()
self.password = StringVar()
self.createPage()
def createPage(self):
self.page = Frame(self.root) # 建立Frame
self.page.pack()
Label(self.page).grid(row=0, stick=W)
Label(self.page, text='賬戶: ').grid(row=1, stick=W, pady=10)
Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=E)
Label(self.page, text='密碼: ').grid(row=2, stick=W, pady=10)
Entry(self.page, textvariable=self.password, show='*').grid(row=2, column=1, stick=E)
Button(self.page, text='登陸', command=self.loginCheck).grid(row=3, stick=W, pady=10)
Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=1, stick=E)
def loginCheck(self):
name = self.username.get()
password = self.password.get()
if name == 'hacker707' and password == 'admin':
self.page.destroy()
MenuPage(self.root)
else:
showinfo(title='錯誤', message='賬號或密碼錯誤!')
db.py
import json
class StudentDB(object):
def __init__(self):
self.students = []
self._load_students_data()
def insert(self, student):
self.students.append(student)
print(self.students)
def all(self):
return self.students
def delete_by_name(self, name): # 刪除資料
for student in self.students:
if name == student["name"]:
self.students.remove(student)
break
else:
return False
return True
# 查詢
def search_by_name(self, name):
for student in self.students:
if name == student["name"]:
return student # 姓名+成績
else:
return False
# 修改
def update(self, stu): # 修改資料
name = stu["name"]
for student in self.students:
if name == student["name"]:
student.update(stu)
return True
else:
return False
# 載入檔案
def _load_students_data(self):
with open("students.txt", "r", encoding="utf-8") as f:
text = f.read()
if text:
self.students = json.loads(text)
# 儲存資料
def save_data(self):
with open("students.txt", 'w', encoding="utf-8") as f:
text = json.dumps(self.students, ensure_ascii=False)
f.write(text)
db = StudentDB()
MenuPage.py
import tkinter as tk
from view import *
class MenuPage(object):
def __init__(self, master=None):
self.root = master
self.root.geometry('%dx%d' % (600, 400))
self.create_page()
self.input_page = InputFrame(self.root)
self.query_page = QuerryFrame(self.root)
self.delete_page = DeleteFrame(self.root)
self.update_page = UpdateFrame(self.root)
self.about_page = AboutFrame(self.root)
self.input_page.pack()
def create_page(self):
# 建立選單物件
menubar = tk.Menu(self.root)
# add_command 新增
menubar.add_command(label="錄入", command=self.input_data) # label
menubar.add_command(label="查詢", command=self.query_data) # label
menubar.add_command(label="刪除", command=self.delete_data) # label
menubar.add_command(label="修改", command=self.update_data) # label
menubar.add_command(label="關於", command=self.about_data) # label
# 設定選單欄
self.root.config(menu=menubar)
# 切換介面
def input_data(self):
self.input_page.pack()
self.update_page.pack_forget()
self.delete_page.pack_forget()
self.about_page.pack_forget()
self.query_page.pack_forget()
def query_data(self):
self.input_page.pack_forget()
self.query_page.pack()
self.update_page.pack_forget()
self.delete_page.pack_forget()
self.about_page.pack_forget()
def update_data(self):
self.input_page.pack_forget()
self.update_page.pack()
self.delete_page.pack_forget()
self.about_page.pack_forget()
self.query_page.pack_forget()
def delete_data(self):
self.input_page.pack_forget()
self.update_page.pack_forget()
self.delete_page.pack()
self.about_page.pack_forget()
self.query_page.pack_forget()
def about_data(self):
self.input_page.pack_forget()
self.update_page.pack_forget()
self.delete_page.pack_forget()
self.about_page.pack()
self.query_page.pack_forget()
view.py
import tkinter as tk
from db import db
from tkinter import ttk
# 錄入類
class InputFrame(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.root = master
self.name = tk.StringVar()
self.math = tk.StringVar()
self.chinese = tk.StringVar()
self.english = tk.StringVar()
self.status = tk.StringVar()
self.create_page()
def create_page(self):
tk.Label(self).grid(row=0, stick=tk.W, pady=10)
tk.Label(self, text="姓名:").grid(row=1, stick=tk.W, pady=10)
# 單行文字框 entry,textvariable繫結變數
tk.Entry(self, textvariable=self.name).grid(row=1, column=1, stick=tk.E)
tk.Label(self, text="數學:").grid(row=2, stick=tk.W, pady=10)
# 單行文字框 entry,textvariable繫結變數
tk.Entry(self, textvariable=self.math).grid(row=2, column=1, stick=tk.E)
tk.Label(self, text="語文:").grid(row=3, stick=tk.W, pady=10)
# 單行文字框 entry,textvariable繫結變數
tk.Entry(self, textvariable=self.chinese).grid(row=3, column=1, stick=tk.E)
tk.Label(self, text="英語:").grid(row=4, stick=tk.W, pady=10)
# 單行文字框 entry,textvariable繫結變數
tk.Entry(self, textvariable=self.english).grid(row=4, column=1, stick=tk.E)
tk.Button(self, text="錄入", command=self.recode_student).grid(row=5, column=1, stick=tk.E, pady=10)
tk.Label(self, textvariable=self.status).grid(row=6, column=1, stick=tk.E, pady=10)
# 錄入成績
def recode_student(self):
student = {
"name": self.name.get(),
"math": self.math.get(),
"chinese": self.chinese.get(),
"english": self.english.get(),
} # 一個學生的成績
db.insert(student)
# get()得到值
# set()設定值
self.status.set("插入資料成功!")
self._clear_data()
db.save_data()
# 清空文字資料
def _clear_data(self):
self.name.set("")
self.math.set("")
self.chinese.set("")
self.english.set("")
# 查詢類
class QuerryFrame(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.root = master
self.create_page()
# 建立查詢介面
def create_page(self):
self.create_tree_view()
self.show_data_frame()
# grid()
tk.Button(self, text="重新整理資料", command=self.show_data_frame).pack(anchor=tk.E, pady=5)
# Treeview
def create_tree_view(self):
# 表頭
columns = ("name", "chinese", "math", "english")
self.tree_view = ttk.Treeview(self, show='headings', columns=columns)
self.tree_view.column("name", width=80, anchor='center')
self.tree_view.column("chinese", width=80, anchor='center')
self.tree_view.column("math", width=80, anchor='center')
self.tree_view.column("english", width=80, anchor='center')
self.tree_view.heading("name", text='姓名')
self.tree_view.heading("chinese", text='語文')
self.tree_view.heading("math", text='數學')
self.tree_view.heading("english", text='英語')
self.tree_view.pack()
# 顯示資料
def show_data_frame(self):
# 刪除原節點 map(int,值)
for i in map(self.tree_view.delete, self.tree_view.get_children("")):
pass
# 拿到列表裡面所有值、students[]
students = db.all()
# 同時拿到索引跟value值
for index, stu in enumerate(students):
self.tree_view.insert('', index, values=(stu["name"], stu["chinese"], stu
["math"], stu["english"]))
class DeleteFrame(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
tk.Label(self, text='刪除資料').pack()
self.status = tk.StringVar()
self.de_name = tk.StringVar() # 獲取刪除學生的姓名
self.create_page()
# 建立介面
def create_page(self):
tk.Label(self, text="根據姓名刪除資訊").pack(anchor=tk.W, padx=20)
e1 = tk.Entry(self, textvariable=self.de_name)
e1.pack(side=tk.LEFT, padx=20, pady=5)
tk.Button(self, text='刪除', command=self._delete).pack(side=tk.RIGHT)
tk.Label(self, textvariable=self.status).pack()
# 刪除
def _delete(self):
name = self.de_name.get()
print(name)
result = db.delete_by_name(name)
if result:
self.status.set(f'{name}已經被刪')
self.de_name.set("")
else:
self.status.set(f'{name}不存在')
class UpdateFrame(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.root = master
tk.Label(self, text='修改介面').pack()
self.change_frame = tk.Frame(self)
self.change_frame.pack()
self.name = tk.StringVar()
self.math = tk.StringVar()
self.chinese = tk.StringVar()
self.english = tk.StringVar()
self.status = tk.StringVar()
self.create_page()
def create_page(self):
tk.Label(self.change_frame).grid(row=0, stick=tk.W, pady=10)
tk.Label(self.change_frame, text="姓名:").grid(row=1, stick=tk.W, pady=10)
# 單行文字框 entry,textvariable繫結變數
tk.Entry(self.change_frame, textvariable=self.name).grid(row=1, column=1, stick=tk.E)
tk.Label(self.change_frame, text="數學:").grid(row=2, stick=tk.W, pady=10)
# 單行文字框 entry,textvariable繫結變數
tk.Entry(self.change_frame, textvariable=self.math).grid(row=2, column=1, stick=tk.E)
tk.Label(self.change_frame, text="語文:").grid(row=3, stick=tk.W, pady=10)
# 單行文字框 entry,textvariable繫結變數
tk.Entry(self.change_frame, textvariable=self.chinese).grid(row=3, column=1, stick=tk.E)
tk.Label(self.change_frame, text="英語:").grid(row=4, stick=tk.W, pady=10)
# 單行文字框 entry,textvariable繫結變數
tk.Entry(self.change_frame, textvariable=self.english).grid(row=4, column=1, stick=tk.E)
# 按鈕
tk.Button(self.change_frame, text='查詢', command=self._search).grid(row=6, column=0, stick=tk.W, pady=10)
tk.Button(self.change_frame, text='修改', command=self._change).grid(row=6, column=1, stick=tk.E, pady=10)
tk.Label(self.change_frame, textvariable=self.status).grid(row=7, column=1, stick=tk.E, pady=10)
# 查詢
def _search(self):
name = self.name.get()
student = db.search_by_name(name)
if student:
self.math.set(student["math"])
self.chinese.set(student["chinese"])
self.english.set(student["english"])
self.status.set(f'查詢到{name}同學的資訊')
else:
self.status.set(f'沒有查詢到{name}同學的資訊')
# 更改成績
def _change(self):
name = self.name.get()
math = self.math.get()
chinese = self.chinese.get()
english = self.english.get()
stu = {
"name": name,
"math": math,
"chinese": chinese,
"english": english,
}
r = db.update(stu)
if r:
self.status.set(f"{name}同學的資訊更新完畢")
else:
self.status.set(f"{name}同學的資訊更新失敗")
class AboutFrame(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.root = master
self.create_page()
def create_page(self):
tk.Label(self, text="關於本作品(人生苦短,我用python)").pack(anchor=tk.W)
結束語?
?推薦一款模擬面試、刷題神器網站
點選連結註冊即可
1、演算法篇(398題):面試必刷100題、演算法入門、面試高頻榜單
2、SQL篇(82題):快速入門、SQL必知必會、SQL進階挑戰、面試真題
3、大廠筆試真題:位元組跳動、美團、百度、騰訊…
相關文章
- python mysql實現學生成績管理系統蠖脲PythonMySql
- 學生成績管理
- 學生成績管理系統——課程設計報告
- 基於java jsp的大學生成績管理系統JavaJS
- Django學生資訊管理系統(6)學生成績新增和學生成績查詢(多對對關係)Django
- java績效管理系統Java
- sql統計-關於學生成績SQL
- Java Swing+Mysql+beautyEye(介面優美)學校成績管理系統(管理員/學生/教師,資訊管理/選課管理/成績管理)JavaMySql
- 學生成績管理系統(C++指標、連結串列、檔案及物件導向的運用)C++指標物件
- Python簡易學生管理系統Python
- CRM管理系統如何帶來業績?
- 學生成績錄入系統,需要判斷成績格式合格,使用throw彈出,最後並列印全班成績單
- 學生成績等級判斷
- PTA (學生成績讀取與排序)排序
- 如何藉助CRM銷售管理系統提升業績?
- Python學生資訊管理系統-簡易版(Python基礎)Python
- 學籍管理系統
- 學生管理系統
- C語言陣列求學生成績C語言陣列
- [Python急救站]簡單的學生管理系統Python
- Python編寫簡單的學生資訊管理系統Python
- 學生管理系統(springMVC)SpringMVC
- SchoolCMS學校管理系統
- CRM客戶管理系統幫助企業增長業績
- python做頻率統計圖 完整版Python
- 系統巡檢Python生成word報告🧫Python
- python實現學生資訊管理系統(從淺到深)Python
- Python專案開發案例(一)————學生資訊管理系統Python
- 教你如何運用python實現學生資訊管理系統Python
- 教你如何用python實現學生通訊錄管理系統Python
- Python—簡單圖書管理系統Python
- 【PTA】 學生成績錄入及查詢 (20分)
- Java+Eclipse+MySQL+Swing實現學生會考成績管理系統(免費完整專案)JavaEclipseMySql
- CRM客戶管理系統幫助企業提升銷售業績
- 【C++】學生管理系統C++
- JAVA學生宿舍管理系統Java
- 使用EasyUI開發銀行業績統計系統[21]-選單管理的Code OnUI行業
- 【學習圖片】14.網站生成器、框架和內容管理系統網站框架