<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
一個帶有登入介面具有增減改查功能的學生成績管理系統(物件導向思想,利用tkinter庫進行製作,利用.txt檔案進行儲存資料)
✅僅供學習參考,最好還是自己多敲多練習(實踐是檢驗真理的唯一標準)
用於儲存資料
from tkinter import * from Login import * import tkinter as tk root = tk.Tk() root.title('歡迎進入學生成績管理系統') LoginPage(root) root.mainloop()
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='賬號或密碼錯誤!')
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()
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()
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)
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45