1,创建登陆的首页面,且封装起来。LoginPage.py
import tkinter as tk#导入tk模块
from tkinter import messagebox#导入消息提示模块
from tkinter import messagebox
from db import db #导入数据库db
class LoginPage:#把整个登陆页面创建一个class类进行封装
def __init__(self,master):#创建登陆页面函数
self.root = master #创建登陆页面
self.root.geometry('300x180')#登陆页面的大小是300*180
self.root.title('登陆页')#登陆页的标签名字是
self.username = tk.StringVar()#定义输入账户
self.password = tk.StringVar()#定义输入密码
self.page = tk.Frame(root)#page是第二页的变量
self.page.pack()#第二页
tk.Label(self.page).grid(row=0,columnspan=1)
tk.Label(self.page,text='账户:').grid(row=1,column=1)
tk.Entry(self.page,textvariable=self.username).grid(row=1,column=2)#第二行第二列.把账户输入绑定textvariable=username
tk.Label(self.page,text='密码:').grid(row=1,column=1,pady=10)#第一行第一列,间隔10
tk.Entry(self.page,textvariable=self.password).grid(row=2,column=2)#第二行第二列。把密码输入绑定textvariable=password
tk.Button(self.page,text='登陆',command=self.login).grid(row=3,column=1,pady=10)#第三行第一列,间隔10.登陆事件绑定command=login
tk.Button(self.page,text='退出',command=self.page.quit).grid(row=3,column=2)#第三行第二列。退出事件绑定command=page.quit
def login(self):#登陆函数的方法
name = self.username.get()#输入账号
pwd = self.password.get()#输入密码
flag, message = db.check_login(name, pwd) # 标志位flag,比对db.py数据库里的用户名和密码
if flag: # 使用flag:替代了name == 'admin' and pwd== '123456'
print('登陆成功')
else:
messagebox.showwarning(title='警告', message=message) # message替代登陆失败,请检查账号是否正确
if __name__ == '__main__':
root = tk.Tk()
LoginPage(master=root)
root.mainloop()#
2.创建管理员账号数据库db.py
import json#导入json模块
class MysqlDatabases:#创建MysqlDatabases数据库类
def __init__(self):
with open('users.json',mode='r',encoding='utf-8') as f:#读取同目录下的数据库文件users.json的账户和密码
text = f.read()
self.users = json.loads(text)
def check_login(self,username,password):#创建账户和密码登陆检测方法
for user in self.users:
if username ==user['username']:
if password ==user['password']:
return True,'登陆成功'
else:
return False,'登陆失败'
return False, '登陆失败,用户不存在'
db = MysqlDatabases()
if __name__ == '__main__':
print(db.check_login('admin','123456'))
3.创建数据库文件users.json
4.创建主程序页面MianPage.py
import tkinter as tk#导入tk模块
class MianPage:#定义主页面类Mianpage
def __init__(self,master: tk.Tk):#tk.Tk没有实际意义主要是为了root.geometry输入时自动跳出补全
self.root = master#设置类属性
self.root.title('学生信息管理系统v0.001')#设置类属性标题
self.root.geometry('600x400')#设置类属性屏幕大小
if __name__ == '__main__':
root = tk.Tk()
MianPage(root)
root.mainloop()
5.由登陆页面跳转到主页面在2.登陆页面修改3个地方
1.
import tkinter as tk#导入tk模块
from tkinter import messagebox#导入消息提示模块
from tkinter import messagebox
from db import db
from MinaPage import MianPage#导入Minapage页面
class LoginPage:#把整个登陆页面创建一个class类进行封装
def __init__(self,master):#创建登陆页面函数
self.root = master #创建登陆页面
self.root.geometry('300x180')#登陆页面的大小是300*180
self.root.title('登陆页')#登陆页的标签名字是
self.username = tk.StringVar()#定义输入账户
self.password = tk.StringVar()#定义输入密码
self.page = tk.Frame(root)#page是第二页的变量
self.page.pack()#第二页
tk.Label(self.page).grid(row=0,columnspan=1)
tk.Label(self.page,text='账户:').grid(row=1,column=1)
tk.Entry(self.page,textvariable=self.username).grid(row=1,column=2)#第二行第二列.把账户输入绑定textvariable=username
tk.Label(self.page,text='密码:').grid(row=2,column=1,pady=10)#第一行第一列,间隔10
tk.Entry(self.page,textvariable=self.password).grid(row=2,column=2)#第二行第二列。把密码输入绑定textvariable=password
tk.Button(self.page,text='登陆',command=self.login).grid(row=3,column=1,pady=10)#第三行第一列,间隔10.登陆事件绑定command=login
tk.Button(self.page,text='退出',command=self.page.quit).grid(row=3,column=2)#第三行第二列。退出事件绑定command=page.quit
def login(self):#登陆函数的方法
name = self.username.get()#输入账号
pwd = self.password.get()#输入密码
flag, message = db.check_login(name, pwd) # 标志位flag,比对db.py数据库里的用户名和密码
if flag: # 使用flag:替代了name == 'admin' and pwd== '123456'
self.page.destroy()#destroy意思摧毁当前页面。把print('登陆成功')替换为self.page.destroy()
MianPage(self.root)#跳转到主页面MianPage页面
else:
messagebox.showwarning(title='警告', message=message) # message替代登陆失败,请检查账号是否正确
if __name__ == '__main__':
root = tk.Tk()
LoginPage(master=root)
root.mainloop()#
2.3.
6.显示菜单下的子菜单
import tkinter as tk#导入tk模块
class MianPage:#定义主页面类Mianpage
def __init__(self,master: tk.Tk):#tk.Tk没有实际意义主要是为了root.geometry输入时自动跳出补全
self.root = master#设置类属性
self.root.title('学生信息管理系统v0.001')#设置类属性标题
self.root.geometry('600x400')#设置类属性屏幕大小
self.create_page() # 把定义的creagte_page方法加入到类属性
def create_page(self):
self.about_frame = tk.Frame(self.root)
tk.Label(self.about_frame,text='关于作品:本作品由tk出品').pack()
tk.Label(self.about_frame,text='关于作者:萌新').pack()
tk.Label(self.about_frame,text='B站号:tk出品').pack()
# self.change_frame = tk.Frame(self.root)
# tk.Label(self.change_frame, text='修改页面')
# tk.Label(self.about_frame,text='关于作品:本作品由tk出品').pack()
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='关于', command=self.show_about)
self.root['menu'] = menubar
def show_about(self):
self.about_frame.pack()
if __name__ == '__main__':
root = tk.Tk()
MianPage(root)
root.mainloop()
7.子菜单下面再显示的第一个子菜单。
import tkinter as tk#导入tk模块
from views import AboutFrame,InsertFrame,SearchFrame,ChangeFrame,DeleteFrame
class MianPage:#定义主页面类Mianpage
def __init__(self,master: tk.Tk):#tk.Tk没有实际意义主要是为了root.geometry输入时自动跳出补全
self.root = master#设置类属性
self.root.title('学生信息管理系统v0.001')#设置类属性标题
self.root.geometry('600x400')#设置类属性屏幕大小
self.create_page() # 把定义的creagte_page方法加入到类属性
def create_page(self):#定义子菜单关于,修改,插入,删除,改变
self.about_frame = AboutFrame(self.root)#把tk.Frame(self.root)替换为函数
# tk.Label(self.about_frame,text='关于作品:本作品由tk出品').pack()#使用AboutFrame函数后注释掉
# tk.Label(self.about_frame,text='关于作者:萌新').pack()#使用AboutFrame函数后注释掉
# tk.Label(self.about_frame,text='B站号:tk出品').pack()#使用AboutFrame函数后注释掉
self.change_frame = ChangeFrame(self.root)#把tk.Frame(self.root)替换为ChangeFrame
#tk.Label(self.change_frame, text='修改页面').pack()#使用ChangeFrame函数后注释掉
# tk.Label(self.about_frame,text='关于作品:本作品由tk出品').pack()
self.insert_frame = InsertFrame(self.root)#传递InsertFrame函数
self.search_frame = SearchFrame(self.root)#传递SearchFrame函数
self.delete_frame = DeleteFrame(self.root)#传递DeletelFrame函数
menubar = tk.Menu(self.root)
menubar.add_command(label='录入',command=self.show_insert)
menubar.add_command(label='查询',command=self.show_search)
menubar.add_command(label='删除',command=self.show_delete)
menubar.add_command(label='修改',command=self.show_change)
menubar.add_command(label='关于', command=self.show_about)
self.root['menu'] = menubar#相应点击事件
def show_about(self):
self.insert_frame.pack_forget()#隐藏
self.search_frame.pack_forget()#隐藏
self.delete_frame.pack_forget()#隐藏
self.about_frame.pack()#显示关于菜单
self.change_frame.pack_forget()#多重显示菜单,隐藏change的菜单只显示关于的
def show_change(self):
self.insert_frame.pack_forget()#隐藏
self.search_frame.pack_forget()#隐藏
self.delete_frame.pack_forget()#隐藏
self.change_frame.pack()#显示修改菜单
self.about_frame.pack_forget()#多重显示菜单,隐藏关于的的菜单只显示
def show_insert(self):
self.insert_frame.pack()#显示插入菜单
self.search_frame.pack_forget()#隐藏
self.delete_frame.pack_forget()#隐藏
self.about_frame.pack_forget()#隐藏
self.change_frame.pack_forget()#多重显示菜单,隐藏change的菜单只显示关
def show_search(self):
self.insert_frame.pack_forget()#隐藏
self.search_frame.pack()#显示寻找菜单
self.delete_frame.pack_forget()#隐藏
self.about_frame.pack_forget()#隐藏
self.change_frame.pack_forget()#多重显示菜单,隐藏change的菜单只显示关
def show_delete(self):
self.insert_frame.pack_forget()#隐藏
self.search_frame.pack_forget()#隐藏
self.delete_frame.pack()#显示删除菜单
self.about_frame.pack_forget()#隐藏
self.change_frame.pack_forget()##隐藏
if __name__ == '__main__':
root = tk.Tk()
MianPage(root)
root.mainloop()
8.查询页面wiwes.py的页面布局,事件响应,数据刷新按钮,
import tkinter as tk
from tkinter import ttk
from db import db
class AboutFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self, text='关于作品:本作品由tk出品').pack()
tk.Label(self, text='关于作者:萌新').pack()
tk.Label(self, text='版权所有:tk出品').pack()
class InsertFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='插入页面').pack()
class SearchFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='查询页面').pack()
self.table_view = tk.Frame()#使用tk的框架新建页面
self.table_view.pack()#使用tk的框架新建页面
self.create_page()#使用tk的框架新建页面
def create_page(self):#使用tk的框架新建页面函数
columns = ("name","chinese","math","english")#使用tk的框架的表头
columns_values = ("姓名","语文","数学","英语")#使用tk的框架的表头
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(fill=tk.BOTH,expand=True)#页面布局
self.show_data_frame()#数据展示函数加入属性
tk.Button(self,text='刷新数据',command=self.show_data_frame).pack(anchor=tk.E,pady=5)#创建刷新按钮,且给5个像素,位于右下角
def show_data_frame(self):#创建数据展示函数
#删除旧的数据,刷新,更新数据
for _ in map(self.tree_view.delete,self.tree_view.get_children('')):
pass
students = db.all()
index = 0
for stu in students:#for循环遍历数据库库student
print(stu)#打印出数据库student,且以字典的形式展示出来
self.tree_view.insert('',index + 1,values=(
stu['name'],stu['math'],stu['chinese'],stu['english']
))
class ChangeFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='修改页面').pack()
class DeleteFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='删除页面').pack()
9.录入数据函数的建立,页面的布局,
import tkinter as tk
from tkinter import ttk
from db import db
class AboutFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self, text='关于作品:本作品由tk出品').pack()
tk.Label(self, text='关于作者:萌新').pack()
tk.Label(self, text='版权所有:tk出品').pack()
class InsertFrame(tk.Frame):#创建录入的类
def __init__(self,root):
super().__init__(root)
#tk.Label(self,text='插入页面').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).grid(row=0,pady=10)#pady上下间隔10像素
tk.Label(self,text='姓名:').grid(row=1,column=1,pady=10)
tk.Entry(self,textvariable=self.name).grid(row=1,column=2,pady=10)
tk.Label(self, text='数学:').grid(row=2, column=1, pady=10)
tk.Entry(self, textvariable=self.math).grid(row=2, column=2, pady=10)
tk.Label(self, text='语文:').grid(row=3, column=1, pady=10)
tk.Entry(self, textvariable=self.chinese).grid(row=3, column=2, pady=10)
tk.Label(self, text='英语:').grid(row=4, column=1, pady=10)
tk.Entry(self, textvariable=self.english).grid(row=4, column=2, pady=10)
tk.Button(self,text='录入',command=self.recode_info).grid(row=5,column=2,pady=10)#cmand点击事件
tk.Label(self,textvariable=self.status).grid(row=6,column=2,pady=10,stick=tk.E)#文本录入状态
def recode_info(self):#创建录入信息的方法即函数
stu = {"name":self.name.get(),"math":self.math.get(),
"chinese":self.chinese.get(),"english":self.english.get()}
self.name.set('')#数据录入完成后清空菜单栏
self.math.set('')#数据录入完成后清空菜单栏
self.chinese.set('')#数据录入完成后清空菜单栏
self.english.set('')#数据录入完成后清空菜单栏
print(stu)
db.insert(stu)#导入db.py里的函数insert来更新db数据库,刷新可以看到新的成绩列表
self.status.set('录入数据成功')
class SearchFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='查询页面').pack()
self.table_view = tk.Frame()#使用tk的框架新建页面
self.table_view.pack()#使用tk的框架新建页面
self.create_page()#使用tk的框架新建页面
def create_page(self):#使用tk的框架新建页面函数
columns = ("name","chinese","math","english")#使用tk的框架的表头
columns_values = ("姓名","语文","数学","英语")#使用tk的框架的表头
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(fill=tk.BOTH,expand=True)#页面布局
self.show_data_frame()#数据展示函数加入属性
tk.Button(self,text='刷新数据',command=self.show_data_frame).pack(anchor=tk.E,pady=5)#创建刷新按钮,且给5个像素,位于右下角
def show_data_frame(self):#创建数据展示函数
#删除旧的数据,刷新,更新数据
for _ in map(self.tree_view.delete,self.tree_view.get_children('')):
pass
students = db.all()
index = 0
for stu in students:#for循环遍历数据库库student
print(stu)#打印出数据库student,且以字典的形式展示出来
self.tree_view.insert('',index + 1,values=(
stu['name'],stu['math'],stu['chinese'],stu['english']
))
class ChangeFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='修改页面').pack()
class DeleteFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='删除页面').pack()
10.录入页面的展示
11.删除数据
import tkinter as tk
from tkinter import ttk
from db import db
class AboutFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self, text='关于作品:本作品由tk出品').pack()
tk.Label(self, text='关于作者:萌新').pack()
tk.Label(self, text='版权所有:tk出品').pack()
class InsertFrame(tk.Frame):#创建录入的类
def __init__(self,root):
super().__init__(root)
#tk.Label(self,text='插入页面').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).grid(row=0,pady=10)#pady上下间隔10像素
tk.Label(self,text='姓名:').grid(row=1,column=1,pady=10)
tk.Entry(self,textvariable=self.name).grid(row=1,column=2,pady=10)
tk.Label(self, text='数学:').grid(row=2, column=1, pady=10)
tk.Entry(self, textvariable=self.math).grid(row=2, column=2, pady=10)
tk.Label(self, text='语文:').grid(row=3, column=1, pady=10)
tk.Entry(self, textvariable=self.chinese).grid(row=3, column=2, pady=10)
tk.Label(self, text='英语:').grid(row=4, column=1, pady=10)
tk.Entry(self, textvariable=self.english).grid(row=4, column=2, pady=10)
tk.Button(self,text='录入',command=self.recode_info).grid(row=5,column=2,pady=10)#cmand点击事件
tk.Label(self,textvariable=self.status).grid(row=6,column=2,pady=10,stick=tk.E)#文本录入状态
def recode_info(self):#创建录入信息的方法即函数
stu = {"name":self.name.get(),"math":self.math.get(),
"chinese":self.chinese.get(),"english":self.english.get()}
self.name.set('')#数据录入完成后清空菜单栏
self.math.set('')#数据录入完成后清空菜单栏
self.chinese.set('')#数据录入完成后清空菜单栏
self.english.set('')#数据录入完成后清空菜单栏
print(stu)
db.insert(stu)#导入db.py里的函数insert来更新db数据库,刷新可以看到新的成绩列表
self.status.set('录入数据成功')
class SearchFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='查询页面').pack()
self.table_view = tk.Frame()#使用tk的框架新建页面
self.table_view.pack()#使用tk的框架新建页面
self.create_page()#使用tk的框架新建页面
def create_page(self):#使用tk的框架新建页面函数
columns = ("name","chinese","math","english")#使用tk的框架的表头
columns_values = ("姓名","语文","数学","英语")#使用tk的框架的表头
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(fill=tk.BOTH,expand=True)#页面布局
self.show_data_frame()#数据展示函数加入属性
tk.Button(self,text='刷新数据',command=self.show_data_frame).pack(anchor=tk.E,pady=5)#创建刷新按钮,且给5个像素,位于右下角
def show_data_frame(self):#创建数据展示函数
#删除旧的数据,刷新,更新数据
for _ in map(self.tree_view.delete,self.tree_view.get_children('')):
pass
students = db.all()
index = 0
for stu in students:#for循环遍历数据库库student
print(stu)#打印出数据库student,且以字典的形式展示出来
self.tree_view.insert('',index + 1,values=(
stu['name'],stu['math'],stu['chinese'],stu['english']
))
class ChangeFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='修改页面').pack()
class DeleteFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
#tk.Label(self,text='删除页面').pack()
self.username = tk.StringVar()
self.status = tk.StringVar()
tk.Label(self,text='根据名字删除').pack()
tk.Entry(self,textvariable=self.username).pack()
tk.Button(self,text='删除',command=self.delete).pack()
tk.Label(self,textvariable=self.status).pack()
def delete(self):
username = self.username.get()#获取输入用户名字
flag,message = db.delete_by_username(username)#添加标签,弹出消息提示
self.status.set(message)
db.py
import json#导入json模块
class MysqlDatabases:#创建MysqlDatabases数据库类
def __init__(self):
with open('users.json',mode='r',encoding='utf-8') as f:#读取同目录下的数据库文件users.json的账户和密码
text = f.read()
self.users = json.loads(text)
#self.users = json.loads(open('users.json', mode='r', encoding='utf-8').read())
self.students = json.loads(open('students.json',mode='r',encoding='utf-8').read())
def check_login(self,username,password):#创建账户和密码登陆检测方法
for user in self.users:
if username ==user['username']:
if password ==user['password']:
return True,'登陆成功'
else:
return False,'登陆失败'
return False, '登陆失败,用户不存在'
def all(self):
return self.students
def insert(self,student):#创建insert函数把录入的studen信息添加进来数据库
self.students.append(student)#把录入的studen信息添加进来数据库
def delete_by_username(self,name):#创建根据学籍用户名删除函数
for student in self.students:#遍历数据库
print(student)
if student['name'] == name:
self.students.remove(student)#清除删除的用户数据
return True,f'{name}删除用户成功'
return False,f'{name}用户不存在'
db = MysqlDatabases()
if __name__ == '__main__':
# print(db.check_login('admin','123456'))
# print(db.all())
print(db.delete_by_username('张三疯'))
删除数据用户名是1 的数据信息
12.数据的修改,在db.py函数里面创建update函数和search函数
import json#导入json模块
class MysqlDatabases:#创建MysqlDatabases数据库类
def __init__(self):
with open('users.json',mode='r',encoding='utf-8') as f:#读取同目录下的数据库文件users.json的账户和密码
text = f.read()
self.users = json.loads(text)
#self.users = json.loads(open('users.json', mode='r', encoding='utf-8').read())
self.students = json.loads(open('students.json',mode='r',encoding='utf-8').read())
def check_login(self,username,password):#创建账户和密码登陆检测方法
for user in self.users:
if username ==user['username']:
if password ==user['password']:
return True,'登陆成功'
else:
return False,'登陆失败'
return False, '登陆失败,用户不存在'
def all(self):
return self.students
def insert(self,student):#创建insert函数把录入的studen信息添加进来数据库
self.students.append(student)#把录入的studen信息添加进来数据库
def delete_by_username(self,name):#创建根据学籍用户名删除函数
for student in self.students:#遍历数据库
print(student)
if student['name'] == name:
self.students.remove(student)#清除删除的用户数据
return True,f'{name}删除用户成功'
return False,f'{name}用户不存在'
def search_by_username(self,name):#创建根据学籍用户名删除函数
for student in self.students:#遍历数据库
#print(student)
if student['name'] == name:
return True,student
return False,f'{name}用户不存在'
def update(self,stu):#创建根据学籍用户名删除函数
for student in self.students:#遍历数据库
#print(student)
if student['name'] == stu['name']:
student.update(stu)
return True,f'{stu["name"]}用户数据修改成功'
return False,f'{stu["name"]}用户不存在'
db = MysqlDatabases()
if __name__ == '__main__':
# print(db.check_login('admin','123456'))
# print(db.all())
#print(db.delete_by_username('张三疯'))
print(db.search_by_username('张三'))
在wiews.py里面创建change_user函数
import tkinter as tk
from tkinter import ttk
from db import db
class AboutFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self, text='关于作品:本作品由tk出品').pack()
tk.Label(self, text='关于作者:萌新').pack()
tk.Label(self, text='版权所有:tk出品').pack()
class InsertFrame(tk.Frame):#创建录入的类
def __init__(self,root):
super().__init__(root)
#tk.Label(self,text='插入页面').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).grid(row=0,pady=10)#pady上下间隔10像素
tk.Label(self,text='姓名:').grid(row=1,column=1,pady=10)
tk.Entry(self,textvariable=self.name).grid(row=1,column=2,pady=10)
tk.Label(self, text='数学:').grid(row=2, column=1, pady=10)
tk.Entry(self, textvariable=self.math).grid(row=2, column=2, pady=10)
tk.Label(self, text='语文:').grid(row=3, column=1, pady=10)
tk.Entry(self, textvariable=self.chinese).grid(row=3, column=2, pady=10)
tk.Label(self, text='英语:').grid(row=4, column=1, pady=10)
tk.Entry(self, textvariable=self.english).grid(row=4, column=2, pady=10)
tk.Button(self,text='录入',command=self.recode_info).grid(row=5,column=2,pady=10)#cmand点击事件
tk.Label(self,textvariable=self.status).grid(row=6,column=2,pady=10,stick=tk.E)#文本录入状态
def recode_info(self):#创建录入信息的方法即函数
stu = {"name":self.name.get(),"math":self.math.get(),
"chinese":self.chinese.get(),"english":self.english.get()}
self.name.set('')#数据录入完成后清空菜单栏
self.math.set('')#数据录入完成后清空菜单栏
self.chinese.set('')#数据录入完成后清空菜单栏
self.english.set('')#数据录入完成后清空菜单栏
print(stu)
db.insert(stu)#导入db.py里的函数insert来更新db数据库,刷新可以看到新的成绩列表
self.status.set('录入数据成功')
class SearchFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
tk.Label(self,text='查询页面').pack()
self.table_view = tk.Frame()#使用tk的框架新建页面
self.table_view.pack()#使用tk的框架新建页面
self.create_page()#使用tk的框架新建页面
def create_page(self):#使用tk的框架新建页面函数
columns = ("name","chinese","math","english")#使用tk的框架的表头
columns_values = ("姓名","语文","数学","英语")#使用tk的框架的表头
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(fill=tk.BOTH,expand=True)#页面布局
self.show_data_frame()#数据展示函数加入属性
tk.Button(self,text='刷新数据',command=self.show_data_frame).pack(anchor=tk.E,pady=5)#创建刷新按钮,且给5个像素,位于右下角
def show_data_frame(self):#创建数据展示函数
#删除旧的数据,刷新,更新数据
for _ in map(self.tree_view.delete,self.tree_view.get_children('')):
pass
students = db.all()
index = 0
for stu in students:#for循环遍历数据库库student
print(stu)#打印出数据库student,且以字典的形式展示出来
self.tree_view.insert('',index + 1,values=(
stu['name'],stu['math'],stu['chinese'],stu['english']
))
class ChangeFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
#tk.Label(self,text='修改页面').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).grid(row=0, pady=10) # pady上下间隔10像素
tk.Label(self, text='姓名:').grid(row=1, column=1, pady=10)
tk.Entry(self, textvariable=self.name).grid(row=1, column=2, pady=10)
tk.Label(self, text='数学:').grid(row=2, column=1, pady=10)
tk.Entry(self, textvariable=self.math).grid(row=2, column=2, pady=10)
tk.Label(self, text='语文:').grid(row=3, column=1, pady=10)
tk.Entry(self, textvariable=self.chinese).grid(row=3, column=2, pady=10)
tk.Label(self, text='英语:').grid(row=4, column=1, pady=10)
tk.Entry(self, textvariable=self.english).grid(row=4, column=2, pady=10)
tk.Button(self, text='查询', command=self.search_user).grid(row=5, column=1, pady=10) # 查询command点击事件
tk.Button(self, text='修改', command=self.change_user).grid(row=5, column=2, pady=10) # 修改command点击事件
tk.Label(self, textvariable=self.status).grid(row=6, column=2, pady=10, stick=tk.E) # 文本录入
def search_user(self):
flag,info = db.search_by_username(self.name.get())
if flag:
self.name.set(info['name'])
self.math.set(info['math'])
self.chinese.set(info['chinese'])
self.english.set(info['english'])
self.status.set('数据查询成功')
else:
self.status.set(info)
def change_user(self):
stu = {"name": self.name.get(), "math": self.math.get(),
"chinese": self.chinese.get(), "english": self.english.get()}
self.name.set('') # 数据录入完成后清空菜单栏
self.math.set('') # 数据录入完成后清空菜单栏
self.chinese.set('') # 数据录入完成后清空菜单栏
self.english.set('') # 数据录入完成后清空菜单栏
#print(stu)
db.update(stu) # 导入db.py里的函数来更新db数据库update,刷新可以看到新的成绩列表
self.status.set('修改数据成功')
class DeleteFrame(tk.Frame):
def __init__(self,root):
super().__init__(root)
#tk.Label(self,text='删除页面').pack()
self.username = tk.StringVar()
self.status = tk.StringVar()
tk.Label(self,text='根据名字删除').pack()
tk.Entry(self,textvariable=self.username).pack()
tk.Button(self,text='删除',command=self.delete).pack()
tk.Label(self,textvariable=self.status).pack()
def delete(self):
username = self.username.get()#获取输入用户名字
flag,message = db.delete_by_username(username)#添加标签,弹出消息提示
self.status.set(message)