python学籍管理系统

news2025/6/16 17:01:21

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)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建自己的饥荒Don‘t Starve服务器-饥荒Don‘t Starve开服教程

前言 饥荒这个游戏,虽然首发于2016年,但是贵在好玩呀。和Minecraft一样,可玩性很高,并且有很多mods,最近和小伙伴玩的过程中,就想着搭建一个服务器,方便在主机玩家不在线时候,也可以…

Linux软件安装---Tomcat安装

安装Tomcat 操作步骤: 使用xftp上传工具将tomcat的 二进制发布包上传到Linux解压安装包,命令为tar -zxvf apache-tomcat*** -C /usr/local进入Tomcat的bin的启动目录,命令为sh startup.sh或者./startup.sh 验证Tomcat启动是否成功&#xff0…

LeetCode:376. 摆动序列——说什么贪心和动规~

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀算法专栏: 👉🏻123 一、🌱376. 摆动序列 题目描述:如果连续数字之间的差严格地在正数和…

Python 小型项目大全 46~50

# 四十六、百万骰子投掷统计模拟器 原文:http://inventwithpython.com/bigbookpython/project46.html 当你掷出两个六面骰子时,有 17%的机会掷出 7。这比掷出 2 的几率好得多:只有 3%。这是因为只有一种掷骰子的组合给你 2(当两个…

「 分布式技术 」一致性哈希算法(Hash)详解

「 分布式技术 」一致性哈希算法(Hash)详解 参考&鸣谢 一致性 Hash 算法原理总结 kylinkzhang,腾讯 CSIG 后台开发工程师 什么是一致性哈希? xiaolinCoding 文章目录「 分布式技术 」一致性哈希算法(Hash&#xff…

imagenet val 按类别分类

前言 有时候想看imagenet下某个类别的效果,但它又没划分… 之前看了这篇文章将ImageNet的验证集val数据分类到不同文件夹中,但不是很清楚那代码。 本文基于它的代码去做更改 把这个下下来 https://raw.githubusercontent.com/soumith/imagenetloader.…

ChatGPT 有哪些神奇的使用方式?

在遇到 ChatGPT之前,我很难想象,仅仅不到30s就能做出一个PPT。 而且对于小白来说,这个PPT绝对是「有水准、能拿得出手」的那种。 下面就是我用ChatGPTMindShow做的一套以分享短视频玩法为主题的 PPT,我挑几页大家看一下。 上面这…

10.Java面向对象----继承

Java面向对象—继承 面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统…

2023 Java 面试题之MyBatis篇

持续更新内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、 Linux 等技术栈(滴滴滴.会持续更新哦,记得点赞、关注、分享三连击哈). My…

NumPy 秘籍中文第二版:十、Scikits 的乐趣

原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们将介绍以下秘籍: 安装 scikit-learn加载示例数据集用 scikit-learn 对道琼斯股票进行聚类安装 Statsmodels使用 Statsmodels 执行…

【linux】——引导过程与服务控制

文章目录1.linux操作系统引导过程1.1 引导过程总览1.2 linux操作系统的引导过程1.3 系统初始化进程1.4 Systemd单元类型1.5 运行级别所对应的systemd目标2.排除启动类故障2.1 修复MBR扇区故障2.2 实例:修复MBR扇区故障2.2 修复GRUB引导故障2.3 实例:恢复…

电子数据取证(一)

电子数据取证概述 一,什么是电子数据 电子数据的特点 **1、以数字化形式存在。**所有的电子数据都是基于计算机应用和通信等电子化技术手段形成的,用以表示文字、图形符号、数字、字母等信息的资料。与其他证据种类不同,电子数据在本质上而…

Perpetuumsoft OLAP ModelKit .NET CRACK

关于 OLAP ModelKit 专业版 可视化您的数据透视表数据。OLAP ModelKit 是用 C# 编写的 .NET 多功能 OLAP 组件,仅包含 100% 托管代码。它具有 XP 主题外观和使用任何 .NET 数据源(ADO.NET 和 IList)的能力。通过在任何第三方组件(…

java 面试消息题1-13

1. Redis 线程模型, 及为什么redis 这么快? 1.Redis虽然是一条一条处理命令的(单线程),但是redis把每一条命令分成了很多个小命令,对这些小命令是多线程执行的。 2. IO 多路复用 - 可以用别人用过的IO。 …

RK3568平台开发系列讲解(调试篇)Oops 日志分析

🚀返回专栏总目录 文章目录 一、OOPS 日志分析二、OOPS 上的跟踪转储三、使用 objdump 识别内核模块中的错误代码行沉淀、分享、成长,让自己和他人都能有所收获!😄 📢编写代码并不总是内核开发中最难的方面。 调试是真正的瓶颈,即使对于经验丰富的内核开发人员也是如此…

Java同学入职环境安装全讲解

一、简述 最近入职一家新公司,拿到新电脑,那肯定有绕不开的装开发环境流程。下面我就从安装jdk、maven、git、idea四个方面讲解(主要提供各个软件官方的下载网址,因为百度搜出来的东西大家懂的都懂我就不多说了)。如果…

windows下安装虚拟环境保存在C盘之解决方案

正常在研究深度学习算法模型时,会现去创建一个配置软件包的虚拟环境,在windows下,一般新建的虚拟环境保存在Anaconda的安装目录下,比如我的安装目录是在 D:\program\Anaconda3\,然后虚拟环境将安装在anaconda中的envs文件夹中&…

钉钉机器人单聊实现互动卡片推送

钉钉开发机器人单聊业务实现背景钉钉待办钉钉卡片卡片类型的工作通知创建并投放卡片机器人发送互动卡片实现过程搭建1. 授权2. 创建机器人3. 创建卡片变量创建链接问题4. 卡片投放测试5. web端调用机器人发送卡片接口6. 生成待办并封装接口新发现总结背景 特定业务场景下的对具…

Spark对正常日志文件清洗并分析

目录 日志文件准备: 一.日志数据清洗: 第一步:数据清洗需求分析: 二.代码实现 2.1 代码和其详解 2.2创建jdbcUtils来连接Mysql数据库 2.3 运行后结果展示: 三、留存用户分析 3.1需求概览 3.2.代码实现 3…

港科夜闻|香港科大(广州)副校长吴宏伟教授与150余位高教界人士分享两会期间见闻及体会...

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大(广州)副校长吴宏伟教授与150余位高教界人士分享两会期间见闻及体会。港专学院及香港高等教育评议会合办“港区高等教育界全国政协委员2023全国两会见闻分享”活动。吴宏伟教授在会上发言表示,全国两会令…