Python實(shí)現(xiàn)GUI學(xué)生管理系統(tǒng)的示例代碼
序 言
哈嘍兄弟們,好久不見!最近實(shí)在太忙了,所以又雙叒叕斷更了~
表弟大學(xué)快畢業(yè)了,學(xué)了一個(gè)學(xué)期Python居然還不會(huì)寫學(xué)生管理系統(tǒng),真的給我丟臉啊,教他又不肯學(xué),還讓我直接給他寫,我真想兩巴掌上去,最終還是寫了給他,誰(shuí)讓他是我表弟呢,關(guān)鍵時(shí)候還是得幫他一把!
寫完了放在那也是放著,所以今天分享給大家吧!
話不多說(shuō),咱們直接開始吧!
代碼解析
一、登錄頁(yè)面
1、定義登錄類及初始化對(duì)象
首先導(dǎo)入咱們需要用到的模塊
from main import MainPage
登錄頁(yè)面
將畫板綁定到實(shí)例對(duì)象
self.root = master
self.page 畫紙 在屏幕上顯示一個(gè)矩形區(qū)域,多用來(lái)作為容器。
self.page = tk.Frame(self.root) self.page.pack() self.root.geometry("300x180")
tkinter 提供的可變變量,定義用戶名和密碼.
self.username = tk.StringVar() self.password = tk.StringVar()
創(chuàng)建一個(gè)label
網(wǎng)格布局
tk.Label(self.page).grid(row=0, column=0) # textvariable 這個(gè)參數(shù)是把 tkinter 里面的字符串變量與 空間綁定起來(lái) tk.Label(self.page, text="賬戶").grid(row=1, column=0, stick=tk.E, pady=10) tk.Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=tk.W, pady=10) tk.Label(self.page, text="密碼").grid(row=2, column=0, stick=tk.E, pady=10) tk.Entry(self.page, textvariable=self.password).grid(row=2, column=1, stick=tk.W, pady=10)
command 接受一個(gè)函數(shù) 執(zhí)行登錄的邏輯
tk.Button(self.page, text="登錄", command=self.login_check).grid(row=3, column=0, stick=tk.W, pady=10) tk.Button(self.page, text="退出", command=root.quit).grid(row=3, column=1, stick=tk.E, pady=10)
2、登錄函數(shù)
檢驗(yàn)登錄
拿到賬號(hào)密碼
name = self.username.get() pwd = self.password.get()
不去查詢數(shù)據(jù)庫(kù)
print(name, pwd) if name == 'admin' and pwd == '123456': tkinter.messagebox.showinfo(title='恭喜', message='登錄成功!')
摧毀當(dāng)前頁(yè)面繪制的內(nèi)容
self.page.destroy()
摧毀整個(gè)頁(yè)面繪制的內(nèi)容
self.root.destroy()
頁(yè)面的切換
MainPage(self.root) else: tkinter.messagebox.showinfo(title='錯(cuò)誤', message='賬戶或者密碼錯(cuò)誤')
3、窗口調(diào)用
調(diào)用本文件方法,在本文件運(yùn)行兩個(gè)輸入,在外面調(diào)用執(zhí)行這個(gè)方法前面的數(shù)據(jù)。
創(chuàng)建一個(gè)對(duì)象,窗口對(duì)象,顯示界面.
if __name__ == '__main__': root = tk.Tk() LoginPage(root) root.mainloop()
二、主頁(yè)面顯示
1、定義頁(yè)面類,方便調(diào)用.
登錄界面
def __init__(self, master): self.root = master self.page = tk.Frame(self.root) self.page.pack() self.root.geometry("%dx%d" % (600, 400)) self.create_page()
創(chuàng)建一個(gè)頂級(jí)菜單,顯示菜單.
def create_page(self): menubar = tk.Menu(self.root) menubar.add_command(label="錄入") menubar.add_command(label="查詢") menubar.add_command(label="刪除") menubar.add_command(label="修改") menubar.add_command(label="關(guān)于")
三 、頁(yè)面顯示
1、綁定各個(gè)頁(yè)面
寫在一起代碼太多,數(shù)據(jù)多,容易寫錯(cuò),混亂,可以寫一個(gè)文件專門來(lái)裝數(shù)據(jù)view.py
在view.py文件定義各個(gè)模塊的類
錄入
class InputFrame(tk.Frame): # 繼承Frame類 def __init__(self, master): # 重新父類 super().__init__(master) pass
查詢
class QueryFrame(tk.Frame): # 繼承Frame類 def __init__(self, master=None): super().__init__(master) pass
刪除
class DeleteFrame(tk.Frame): # 繼承Frame類 def __init__(self, master=None): super().__init__(master)
修改
class ChangeFrame(tk.Frame): # 繼承Frame類 def __init__(self, master=None): super().__init__(master)
關(guān)于
class AboutFrame(tk.Frame): # 繼承Frame類 def __init__(self, master=None): tk.Frame.__init__(self, master) self.root = master
然后在main.py文件中綁定這些數(shù)據(jù)
self.input_page = InputFrame(self.root) self.change_page = ChangeFrame(self.root) self.query_page = QueryFrame(self.root) self.delete_page = DeleteFrame(self.root) self.about_page = AboutFrame(self.root)
2、錄入
在view.py文件中InputFrame類中添加相關(guān)內(nèi)容,名字以及成績(jī)。
- x = IntVar():整型變量,默認(rèn)是0
- x = DoubleVar():浮點(diǎn)型變量,默認(rèn)是0.0
- x = StringVar():字符串變量,默認(rèn)是""
- x = BooleanVar():布爾型變量,True是1,F(xiàn)alse是0
self.root = master # 定義內(nèi)部變量root self.name = tk.StringVar() self.math = tk.StringVar() self.chinese = tk.StringVar() self.english = tk.StringVar() # 錄入 self.status = tk.StringVar() # 調(diào)用create_page()函數(shù) self.create_page()
編寫create_page()函數(shù)
def create_page(self): # pass # stick 控件對(duì)象方向 tk.W 西方位 # pady padding y 上下的寬度 # row 行 表格布局 tk.Label(self).grid(row=0, stick=tk.W, pady=10) tk.Label(self, text='姓 名: ').grid(row=1, stick=tk.W, pady=10) # text variable 綁定控件里面的數(shù)據(jù)內(nèi)容 tk.Entry(self, textvariable=self.name).grid(row=1, column=1, stick=tk.E) tk.Label(self, text='數(shù) 學(xué): ').grid(row=2, stick=tk.W, pady=10) tk.Entry(self, textvariable=self.math).grid(row=2, column=1, stick=tk.E) tk.Label(self, text='語(yǔ) 文: ').grid(row=3, stick=tk.W, pady=10) tk.Entry(self, textvariable=self.chinese).grid(row=3, column=1, stick=tk.E) tk.Label(self, text='英 語(yǔ): ').grid(row=4, stick=tk.W, pady=10) 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)
在main.py中綁定這些數(shù)據(jù)
menubar.add_command(label="錄入", command=self.show_input)
def show_input(self): self.input_page.pack() # pack_forget()隱藏布局 # self.change_page.pack_forget() # self.query_page.pack_forget() # self.delete_page.pack_forget() # self.about_page.pack_forget()
在view.py文件中數(shù)據(jù)錄入
def recode_student(self): stu = {'name': self.name.get(), 'chinese': self.chinese.get(), 'math': self.math.get(), 'english': self.english.get()} # 點(diǎn)擊錄入之后需要刷新頁(yè)面 self.name.set('') self.chinese.set('') self.math.set('') self.english.set('') db.insert(stu) self.status.set('提交數(shù)據(jù)成功') print(stu)
插入數(shù)據(jù)及保存數(shù)據(jù),可以寫一個(gè)文件保存,寫在一起代碼量太大,出現(xiàn)錯(cuò)誤機(jī)率也大寫一個(gè)db.py文件.
class StudentsDB: def __init__(self): self.students = [] def insert(self, student): self.students.append(student) db = StudentsDB() if __name__ == '__main__': print(db.students)
四、查詢數(shù)據(jù)
在QueryFrame()類添加數(shù)據(jù)
ttk.Treeview 樹視圖,百度一下
shows:
- headings
- tree
- data_list
columns
值是一個(gè)列表。列表里每個(gè)元素代表一個(gè)列標(biāo)識(shí)符的名稱。列表的長(zhǎng)度為列的長(zhǎng)度。
繼承Frame類
class QueryFrame(tk.Frame): def __init__(self, master=None): super().__init__(master)
定義內(nèi)部變量root
self.root = master # columns = ('name', 'chinese', 'math', 'english') self.tree_view = ttk.Treeview(self, show='headings', columns=columns)
每個(gè)數(shù)據(jù)大小每一格
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')
上面的標(biāo)簽及headings
self.tree_view.heading('name', text='姓名') self.tree_view.heading('chinese', text='語(yǔ)文') self.tree_view.heading('math', text='數(shù)學(xué)') self.tree_view.heading('english', text='英語(yǔ)') self.tree_view.pack(fill=tk.BOTH, expand=True) tk.Button(self, text='刷新數(shù)據(jù)', command=self.show_data_frame).pack(anchor=tk.E, pady=5) self.show_data_frame()
刷新數(shù)據(jù),顯示數(shù)據(jù).
def show_data_frame(self): # 刪除舊的階段 for _ in map(self.tree_view.delete, self.tree_view.get_children('')): pass # 先要顯示所有數(shù)據(jù) 在db文件加入顯示數(shù)據(jù)代碼 students = db.all() index = 0 for stu in students: # print(stu) self.tree_view.insert('', index + 1, values=( stu['name'], stu['chinese'], stu['math'], stu['english'], ))
顯示數(shù)據(jù)
在db.py中加
def all(self): return self.students
view.py
刷新插入數(shù)據(jù)
第一個(gè)參數(shù):parent : 對(duì)于有樹欄的Treeview,parent是父節(jié)點(diǎn),對(duì)于只是列表欄的Treeview,parent一般為空。
第二個(gè)參數(shù):index :插入位置。可以是END或’end’ ,也可以是數(shù)字的,如果你想新插入的item(記錄)成為第某節(jié)點(diǎn)的第一個(gè),index就設(shè)為0,以此類推。
values:顯示的值及插入的數(shù)據(jù),這一列數(shù)據(jù)。
self.tree_view.insert('', index + 1, values=( stu['name'], stu['chinese'], stu['math'], stu['english'], ))
插入數(shù)據(jù)刷新后更新頁(yè)面
map(func, lst),將傳入的函數(shù)變量func作用到lst變量的每個(gè)元素中,并將結(jié)果組成新的列表(Python2)/迭代器(Python3)返回。
get_children(item=None)
返回一個(gè)item的所有子item,這個(gè)子item是一個(gè)列表形式,如果item沒(méi)指定,則返回根目錄的item
for _ in map(self.tree_view.delete, self.tree_view.get_children('')): pass
在main.py文件綁定數(shù)據(jù)
menubar.add_command(label="查詢", command=self.show_all) def show_all(self): # 隱藏布局 self.input_page.pack_forget() # self.change_page.pack_forget() self.query_page.pack() # self.delete_page.pack_forget() # self.about_page.pack_forget()
五、刪除數(shù)據(jù)
在DeleteFrame()類添加數(shù)據(jù)
class DeleteFrame(tk.Frame): # 繼承Frame類 def __init__(self, master=None): super().__init__(master) self.root = master # 定義內(nèi)部變量root tk.Label(self, text='刪除數(shù)據(jù)').pack() self.delete_frame = tk.Frame(self) self.delete_frame.pack() self.status = tk.StringVar() self.username = tk.StringVar() tk.Label(self.delete_frame, text='根據(jù)名字刪除信息').pack(anchor=tk.W, padx=20) tk.Entry(self.delete_frame, textvariable=self.username).pack(side=tk.LEFT, padx=20, pady=5) tk.Button(self.delete_frame, text='刪除', command=self._delete).pack() tk.Label(self, textvariable=self.status).pack()
1、點(diǎn)擊刪除,刪除數(shù)據(jù)
def _delete(self): username = self.username.get() flag, message = db.delete_by_name(username) self.status.set(message)
在db.py文件中添加刪除邏輯
def delete_by_name(self, name): for student in self.students: if name == student['name']: self.students.remove(student) return True, f'{name} 刪除成功' return False, f'{name} 不存在'
在main.py中綁定數(shù)據(jù)
menubar.add_command(label="刪除", command=self.show_delete) def show_delete(self): self.input_page.pack_forget() self.query_page.pack_forget() self.delete_page.pack()
六、修改數(shù)據(jù)
在ChangeFrame()類添加數(shù)據(jù)
self.root = master # 定義內(nèi)部變量root tk.Label(self, text='修改界面').pack() self.change_frame = tk.Frame(self) self.change_frame.pack() self.status = tk.StringVar() self.name = tk.StringVar() self.math = tk.StringVar() self.chinese = tk.StringVar() self.english = tk.StringVar() tk.Label(self.change_frame).grid(row=0, stick=tk.W, pady=1) tk.Label(self.change_frame, text='姓 名: ').grid(row=1, stick=tk.W, pady=10) tk.Entry(self.change_frame, textvariable=self.name).grid(row=1, column=1, stick=tk.E) tk.Label(self.change_frame, text='數(shù) 學(xué): ').grid(row=2, stick=tk.W, pady=10) tk.Entry(self.change_frame, textvariable=self.math).grid(row=2, column=1, stick=tk.E) tk.Label(self.change_frame, text='語(yǔ) 文: ').grid(row=3, stick=tk.W, pady=10) tk.Entry(self.change_frame, textvariable=self.chinese).grid(row=3, column=1, stick=tk.E) tk.Label(self.change_frame, text='英 語(yǔ): ').grid(row=4, stick=tk.W, pady=10) 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)
1、查詢數(shù)據(jù)
db.py文件中查詢數(shù)據(jù)邏輯
def search_by_name(self, name): for student in self.students: if name == student['name']: return True, student return False, f'{name} 不存在'
view.py文件點(diǎn)擊查詢,顯示數(shù)據(jù)
def _search(self): flag, info = db.search_by_name(self.name.get()) if flag: self.name.set(info['name']) self.chinese.set(info['chinese']) self.math.set(info['math']) self.english.set(info['english']) self.status.set('數(shù)據(jù)查詢成功') else: # 直接返回錯(cuò)誤的信息 self.status.set(info)
2、修改數(shù)據(jù)及更新
db.py文件更新數(shù)據(jù)邏輯
def update(self, stu): name = stu['name'] for student in self.students: if name == student['name']: student.update(stu) return True, f'{stu["name"]} 用戶數(shù)據(jù)修改成功' else: return False, f'{name} 不存在'
view.py文件修改數(shù)據(jù)
def _change(self): stu = {'name': self.name.get(), 'chinese': self.chinese.get(), 'math': self.math.get(), 'english': self.english.get(), } self.name.set('') self.chinese.set('') self.math.set('') self.english.set('') db.update(stu) self.status.set('修改數(shù)據(jù)成功')
main.py文件進(jìn)行綁定
menubar.add_command(label="修改", command=self.show_change) def show_change(self): self.input_page.pack_forget() self.query_page.pack_forget() self.delete_page.pack_forget() self.change_page.pack()
七、關(guān)于部分
view.py中在AboutFrame()添加數(shù)據(jù)
class AboutFrame(tk.Frame): # 繼承Frame類 def __init__(self, master=None): tk.Frame.__init__(self, master) self.root = master # 定義內(nèi)部變量root tk.Label(self, text='關(guān)于作品:本作品由 嗨學(xué)編程 制作').pack(anchor=tk.W) tk.Label(self, text='關(guān)于作者:嗨學(xué)編程').pack(anchor=tk.W) tk.Label(self, text='版權(quán)所有:嗨學(xué)編程').pack(anchor=tk.W)
main.py綁定數(shù)據(jù)
menubar.add_command(label="關(guān)于", command=self.show_about) def show_about(self): self.input_page.pack_forget() self.query_page.pack_forget() self.delete_page.pack_forget() self.change_page.pack_forget() self.about_page.pack()
八、數(shù)據(jù)保存,保存信息
db.py對(duì)數(shù)據(jù)保存
創(chuàng)建空json文件
import os file = "students.json" # 判斷文件是否存在,不存在則創(chuàng)建 if not os.path.exists(file): open(file, 'w') # 報(bào)錯(cuò) # os.mknod(file)
Windows上的Python不支持mknod函數(shù),因?yàn)樵赪indows上沒(méi)有node這個(gè)概念。
1、保存數(shù)據(jù)
def save_data(self): with open('students.json', mode='w', encoding='utf-8') as f: text = json.dumps(self.students, indent=2, ensure_ascii=False) f.write(text)
2 、讀取數(shù)據(jù)
def _load_students_data(self): with open('students.json', mode='r', encoding='utf-8') as f: text = f.read() if text: self.students = json.loads(text)
在view.py文件中調(diào)用保存函數(shù),對(duì)完成后的數(shù)據(jù)進(jìn)行保存。
錄入
def recode_student(self): db.save_data()
刪除
def _delete(self): db.save_data()
修改
def _change(self): db.save_data()
以上就是Python實(shí)現(xiàn)GUI學(xué)生管理系統(tǒng)的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Python GUI學(xué)生管理系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 基于Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的學(xué)生管理系統(tǒng)
- 基于Python實(shí)現(xiàn)面向?qū)ο蟀鎸W(xué)生管理系統(tǒng)
- Python實(shí)現(xiàn)功能全面的學(xué)生管理系統(tǒng)
- Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)并生成exe可執(zhí)行文件詳解流程
- 一篇文章教你用Python實(shí)現(xiàn)一個(gè)學(xué)生管理系統(tǒng)
- Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)(面向?qū)ο蟀?
- Python實(shí)現(xiàn)一個(gè)完整學(xué)生管理系統(tǒng)
相關(guān)文章
Python的scikit-image模塊實(shí)例講解
在本篇文章里小編給大家整理了一篇關(guān)于Python的scikit-image模塊實(shí)例講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2020-12-12Centos7下源碼安裝Python3 及shell 腳本自動(dòng)安裝Python3的教程
這篇文章主要介紹了Centos7下源碼安裝Python3 shell 腳本自動(dòng)安裝Python3的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03python圖片二值化提高識(shí)別率代碼實(shí)例
這篇文章主要介紹了python圖片二值化提高識(shí)別率代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python定時(shí)從Mysql提取數(shù)據(jù)存入Redis的實(shí)現(xiàn)
這篇文章主要介紹了Python定時(shí)從Mysql提取數(shù)據(jù)存入Redis的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05python向量化與for循環(huán)耗時(shí)對(duì)比分析
這篇文章主要介紹了python向量化與for循環(huán)耗時(shí)對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05高考要來(lái)啦!用Python爬取歷年高考數(shù)據(jù)并分析
轉(zhuǎn)眼間,高考的日子又要來(lái)臨了,不知道高考學(xué)子們準(zhǔn)備的怎么樣了,今天這篇文章簡(jiǎn)單且隨意地分析一下高考的一些數(shù)據(jù),需要的朋友可以參考下2021-06-06Python+numpy實(shí)現(xiàn)矩陣的行列擴(kuò)展方式
今天小編就為大家分享一篇Python+numpy實(shí)現(xiàn)矩陣的行列擴(kuò)展方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11解決pyinstaller 打包exe文件太大,用pipenv 縮小exe的問(wèn)題
這篇文章主要介紹了解決pyinstaller 打包exe文件太大,用pipenv 縮小exe的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07