序 言
哈喽兄弟们,好久不见!最近实在太忙了,所以又双叒叕断更了~
表弟大学快毕业了,学了一个学期Python居然还不会写学生管理系统,真的给我丢脸啊,教他又不肯学,还让我直接给他写,我真想两巴掌上去,最终还是写了给他,谁让他是我表弟呢,关键时候还是得帮他一把!
写完了放在那也是放着,所以今天分享给大家吧!
话不多说,咱们直接开始吧!
代码解析
一、登录页面
1、定义登录类及初始化对象
首先导入咱们需要用到的模块
1
|
from main import MainPage |
登录页面
将画板绑定到实例对象
1
|
self .root = master |
self.page 画纸 在屏幕上显示一个矩形区域,多用来作为容器。
1
2
3
|
self .page = tk.Frame( self .root) self .page.pack() self .root.geometry( "300x180" ) |
tkinter 提供的可变变量,定义用户名和密码.
1
2
|
self .username = tk.StringVar() self .password = tk.StringVar() |
创建一个label
网格布局
1
2
3
4
5
6
|
tk.Label( self .page).grid(row = 0 , column = 0 ) # textvariable 这个参数是把 tkinter 里面的字符串变量与 空间绑定起来 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 接受一个函数 执行登录的逻辑
1
2
|
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、登录函数
检验登录
拿到账号密码
1
2
|
name = self .username.get() pwd = self .password.get() |
不去查询数据库
1
2
3
4
|
print (name, pwd) if name = = 'admin' and pwd = = '123456' : tkinter.messagebox.showinfo(title = '恭喜' , message = '登录成功!' ) |
摧毁当前页面绘制的内容
1
|
self .page.destroy() |
摧毁整个页面绘制的内容
1
|
self .root.destroy() |
页面的切换
1
2
3
|
MainPage( self .root) else : tkinter.messagebox.showinfo(title = '错误' , message = '账户或者密码错误' ) |
3、窗口调用
调用本文件方法,在本文件运行两个输入,在外面调用执行这个方法前面的数据。
创建一个对象,窗口对象,显示界面.
1
2
3
4
|
if __name__ = = '__main__' : root = tk.Tk() LoginPage(root) root.mainloop() |
二、主页面显示
1、定义页面类,方便调用.
登录界面
1
2
3
4
5
6
7
|
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() |
创建一个顶级菜单,显示菜单.
1
2
3
4
5
6
7
8
9
|
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 = "关于" ) |
三 、页面显示
1、绑定各个页面
写在一起代码太多,数据多,容易写错,混乱,可以写一个文件专门来装数据view.py
在view.py文件定义各个模块的类
录入
1
2
3
4
5
|
class InputFrame(tk.Frame): # 继承Frame类 def __init__( self , master): # 重新父类 super ().__init__(master) pass |
查询
1
2
3
4
|
class QueryFrame(tk.Frame): # 继承Frame类 def __init__( self , master = None ): super ().__init__(master) pass |
删除
1
2
3
|
class DeleteFrame(tk.Frame): # 继承Frame类 def __init__( self , master = None ): super ().__init__(master) |
修改
1
2
3
|
class ChangeFrame(tk.Frame): # 继承Frame类 def __init__( self , master = None ): super ().__init__(master) |
关于
1
2
3
4
|
class AboutFrame(tk.Frame): # 继承Frame类 def __init__( self , master = None ): tk.Frame.__init__( self , master) self .root = master |
然后在main.py文件中绑定这些数据
1
2
3
4
5
|
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类中添加相关内容,名字以及成绩。
- x = IntVar():整型变量,默认是0
- x = DoubleVar():浮点型变量,默认是0.0
- x = StringVar():字符串变量,默认是""
- x = BooleanVar():布尔型变量,True是1,False是0
1
2
3
4
5
6
7
8
9
|
self .root = master # 定义内部变量root self .name = tk.StringVar() self .math = tk.StringVar() self .chinese = tk.StringVar() self .english = tk.StringVar() # 录入 self .status = tk.StringVar() # 调用create_page()函数 self .create_page() |
编写create_page()函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def create_page( self ): # pass # stick 控件对象方向 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 绑定控件里面的数据内容 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 ) 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 ) 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 ) 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中绑定这些数据
menubar.add_command(label="录入", command=self.show_input)
1
2
3
4
5
6
7
|
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文件中数据录入
1
2
3
4
5
6
7
8
9
10
11
|
def recode_student( 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.insert(stu) self .status. set ( '提交数据成功' ) print (stu) |
插入数据及保存数据,可以写一个文件保存,写在一起代码量太大,出现错误机率也大写一个db.py文件.
1
2
3
4
5
6
7
8
9
10
11
12
|
class StudentsDB: def __init__( self ): self .students = [] def insert( self , student): self .students.append(student) db = StudentsDB() if __name__ = = '__main__' : print (db.students) |
四、查询数据
在QueryFrame()类添加数据
ttk.Treeview 树视图,百度一下
shows:
- headings
- tree
- data_list
columns
值是一个列表。列表里每个元素代表一个列标识符的名称。列表的长度为列的长度。
继承Frame类
1
2
3
|
class QueryFrame(tk.Frame): def __init__( self , master = None ): super ().__init__(master) |
定义内部变量root
1
2
3
|
self .root = master # columns = ( 'name' , 'chinese' , 'math' , 'english' ) self .tree_view = ttk.Treeview( self , show = 'headings' , columns = columns) |
每个数据大小每一格
1
2
3
4
|
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' ) |
上面的标签及headings
1
2
3
4
5
6
7
|
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(fill = tk.BOTH, expand = True ) tk.Button( self , text = '刷新数据' , command = self .show_data_frame).pack(anchor = tk.E, pady = 5 ) self .show_data_frame() |
刷新数据,显示数据.
1
2
3
4
5
6
7
8
9
10
11
12
|
def show_data_frame( self ): # 删除旧的阶段 for _ in map ( self .tree_view.delete, self .tree_view.get_children('')): pass # 先要显示所有数据 在db文件加入显示数据代码 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' ], )) |
显示数据
在db.py中加
1
2
|
def all ( self ): return self .students |
view.py
刷新插入数据
第一个参数:parent : 对于有树栏的Treeview,parent是父节点,对于只是列表栏的Treeview,parent一般为空。
第二个参数:index :插入位置。可以是END或’end’ ,也可以是数字的,如果你想新插入的item(记录)成为第某节点的第一个,index就设为0,以此类推。
values:显示的值及插入的数据,这一列数据。
1
2
3
|
self .tree_view.insert('', index + 1 , values = ( stu[ 'name' ], stu[ 'chinese' ], stu[ 'math' ], stu[ 'english' ], )) |
插入数据刷新后更新页面
map(func, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。
get_children(item=None)
返回一个item的所有子item,这个子item是一个列表形式,如果item没指定,则返回根目录的item
1
2
|
for _ in map ( self .tree_view.delete, self .tree_view.get_children('')): pass |
在main.py文件绑定数据
1
2
3
4
5
6
7
8
9
|
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() |
五、删除数据
在DeleteFrame()类添加数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class DeleteFrame(tk.Frame): # 继承Frame类 def __init__( self , master = None ): super ().__init__(master) self .root = master # 定义内部变量root tk.Label( self , text = '删除数据' ).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 = '根据名字删除信息' ).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、点击删除,删除数据
1
2
3
4
|
def _delete( self ): username = self .username.get() flag, message = db.delete_by_name(username) self .status. set (message) |
在db.py文件中添加删除逻辑
1
2
3
4
5
6
|
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中绑定数据
1
2
3
4
5
|
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() |
六、修改数据
在ChangeFrame()类添加数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
self .root = master # 定义内部变量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 = '数 学: ' ).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 = '语 文: ' ).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 = '英 语: ' ).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、查询数据
db.py文件中查询数据逻辑
1
2
3
4
5
|
def search_by_name( self , name): for student in self .students: if name = = student[ 'name' ]: return True , student return False , f '{name} 不存在' |
view.py文件点击查询,显示数据
1
2
3
4
5
6
7
8
9
10
11
|
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 ( '数据查询成功' ) else : # 直接返回错误的信息 self .status. set (info) |
2、修改数据及更新
db.py文件更新数据逻辑
1
2
3
4
5
6
7
8
|
def update( self , stu): name = stu[ 'name' ] for student in self .students: if name = = student[ 'name' ]: student.update(stu) return True , f '{stu["name"]} 用户数据修改成功' else : return False , f '{name} 不存在' |
view.py文件修改数据
1
2
3
4
5
6
7
8
9
|
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 ( '修改数据成功' ) |
main.py文件进行绑定
1
2
3
4
5
6
|
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() |
七、关于部分
view.py中在AboutFrame()添加数据
1
2
3
4
5
6
7
|
class AboutFrame(tk.Frame): # 继承Frame类 def __init__( self , master = None ): tk.Frame.__init__( self , master) self .root = master # 定义内部变量root tk.Label( self , text = '关于作品:本作品由 嗨学编程 制作' ).pack(anchor = tk.W) tk.Label( self , text = '关于作者:嗨学编程' ).pack(anchor = tk.W) tk.Label( self , text = '版权所有:嗨学编程' ).pack(anchor = tk.W) |
main.py绑定数据
1
2
3
4
5
6
7
|
menubar.add_command(label = "关于" , 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() |
八、数据保存,保存信息
db.py对数据保存
创建空json文件
1
2
3
4
5
6
7
8
|
import os file = "students.json" # 判断文件是否存在,不存在则创建 if not os.path.exists( file ): open ( file , 'w' ) # 报错 # os.mknod(file) |
Windows上的Python不支持mknod函数,因为在Windows上没有node这个概念。
1、保存数据
1
2
3
4
|
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 、读取数据
1
2
3
4
5
|
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文件中调用保存函数,对完成后的数据进行保存。
录入
1
2
|
def recode_student( self ): db.save_data() |
删除
1
2
|
def _delete( self ): db.save_data() |
修改
1
2
|
def _change( self ): db.save_data() |
以上就是Python实现GUI学生管理系统的示例代码的详细内容,更多关于Python GUI学生管理系统的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/fei347795790/article/details/125426789