首页 > 数据库 >python学生管理系统笔记(+增删改查,但不存入数据库或文件中)

python学生管理系统笔记(+增删改查,但不存入数据库或文件中)

时间:2023-05-16 21:01:45浏览次数:37  
标签:name python self 改查 tk 增删 root frame pack

原本的基础上+增删改查,但不存入数据库或文件中,就是数据只在一次运行的页面中进行增删改查,但是重新运行不会有之前的数据,因为没有更新到json或者数据库中。

1.LoginPage.py

import tkinter as tk
from tkinter import messagebox
from db import db
from MainPage import MainPage


class LoginPage:
    def __init__(self, master):
        self.root = master
        self.root.geometry('300x180')
        self.root.title('登录页')

        self.username = tk.StringVar()
        self.password = tk.StringVar()
        #  实现翻页
        self.page = tk.Frame(root)
        self.page.pack()

        # 布局
        tk.Label(self.page).grid(row=0, column=0)

        tk.Label(self.page, text='用户:').grid(row=1, column=1)
        tk.Entry(self.page, textvariable=self.username).grid(row=1, column=2)

        tk.Label(self.page, text='密码:').grid(row=2, column=1, pady=10)
        tk.Entry(self.page, textvariable=self.password).grid(row=2, column=2)

        tk.Button(self.page, text='登录', command=self.login).grid(row=3, column=1, pady=10)
        tk.Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=2)

    # 获取登录信息
    def login(self):
        name = self.username.get()
        pwd = self.password.get()
        flag, msg = db.check_login(name, pwd)
        if flag:
            self.page.destroy()  # 销毁当前页面
            MainPage(self.root)  # 跳转第二个页面
        else:
            messagebox.showwarning(title='警告', message=msg)


if __name__ == '__main__':
    root = tk.Tk()
    LoginPage(master=root)
    root.mainloop()  # 将整个页面显示出来

 

2.MainPage.py

import tkinter as tk
from views import AboutFrame, ChangeFrame, InsertFrame, SearchFram, DeleteFrame


class MainPage:
    # 如果master不写成 master: tk.TK 的话,会没有提示,写了也没有影响,只是说明这个master是一个tk的对象
    def __init__(self, master: tk.Tk):
        self.root = master
        self.root.title('学生信息管理系统 v0.0.1')
        self.root.geometry('600x400')
        self.creat_page()

    # 菜单栏
    def creat_page(self):
        """
        可以直接封装成一个views对象,用的时候直接调用即可
        # '修改'页面
        self.change_frame = tk.Frame(self.root)
        tk.Label(self.change_frame, text='修改页面').pack()

        # '关于'页面布局
        self.about_frame = tk.Frame(self.root)  # 绑定到root对象中
        tk.Label(self.about_frame, text='关于作品:关于本作品由tkinter制作').pack()
        tk.Label(self.about_frame, text='关于制作:关于本作品由tkinter制作').pack()
        """
        """封装后直接调用"""
        self.insert_frame = InsertFrame(self.root)
        self.delete_frame = DeleteFrame(self.root)
        self.chang_frame = ChangeFrame(self.root)
        self.search_frame = SearchFram(self.root)
        self.about_frame = AboutFrame(self.root)

        # 记得要绑定时间command
        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_insert(self):
        self.insert_frame.pack()

        self.delete_frame.pack_forget()
        self.chang_frame.pack_forget()
        self.search_frame.pack_forget()
        self.about_frame.pack_forget()

    def show_delete(self):
        self.delete_frame.pack()
        self.insert_frame.pack_forget()

        self.chang_frame.pack_forget()
        self.search_frame.pack_forget()
        self.about_frame.pack_forget()

    def show_change(self):
        self.chang_frame.pack()
        self.insert_frame.pack_forget()
        self.delete_frame.pack_forget()

        self.search_frame.pack_forget()
        self.about_frame.pack_forget()

    def show_search(self):
        self.search_frame.pack()
        self.insert_frame.pack_forget()
        self.delete_frame.pack_forget()
        self.chang_frame.pack_forget()

        self.about_frame.pack_forget()

    def show_about(self):
        self.about_frame.pack()  # 当点击关于时,进行布局的显示
        self.insert_frame.pack_forget()
        self.delete_frame.pack_forget()
        self.chang_frame.pack_forget()
        self.search_frame.pack_forget()


if __name__ == '__main__':
    root = tk.Tk()
    MainPage(root)
    root.mainloop()

 

3.views.py

"""
封装MainPage中的frame对象
"""
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='关于作品:关于本作品由tkinter制作').pack()
        tk.Label(self, text='关于制作:关于本作品由tkinter制作').pack()


class ChangeFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        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)
        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.chinese).grid(row=2, column=2, pady=10)
        tk.Label(self, text='数 学:').grid(row=3, column=1, pady=10)
        tk.Entry(self, textvariable=self.math).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)
        tk.Button(self, text='修改', command=self.change_user).grid(row=5, column=2, pady=10)
        tk.Label(self, textvariable=self.status).grid(row=6, column=2, pady=10, stick=tk.E)

    def search_user(self):
        # info有可能是信息,有可能是字符串
        flag, info = db.search_by_username(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'])
        else:
            # 查询不到学生信息
            self.status.set(info)

    def change_user(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('更新成功')




class InsertFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        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)
        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.chinese).grid(row=2, column=2, pady=10)
        tk.Label(self, text='数 学:').grid(row=3, column=1, pady=10)
        tk.Entry(self, textvariable=self.math).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, sticky=tk.E)
        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.chinese.set('')
        self.math.set('')
        self.english.set('')

        db.insert(stu)
        self.status.set('录入学生信息成功')

class SearchFram(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.table_view = tk.Frame()
        self.table_view.pack()
        self.create_page()

    # 布局表格
    def create_page(self):
        columns = ("name", "chinese", "math", "english")
        # columns_values = ("姓名", "语文", "数学", "英语")
        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)

    # 展示数据
    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:
            self.tree_view.insert('', index + 1, values=(
                stu['name'], stu['chinese'], stu['math'], stu['english']
            ))


class DeleteFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        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, msg = db.delete_by_username(username)
        self.status.set(msg)

 

4.db.py

"""模型层"""
import json


class MysqlDatabases:
    def __init__(self):
        # 加载数据:读取文件
        with open('users.json', mode='r', encoding='utf-8') as f:
            text = f.read()
        self.users = json.loads(text)
        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, '登录失败,密码错误'
            else:
                return False, '登录失败,用户不存在'

    def all(self):
        return self.students

    def insert(self, student):
        self.students.append(student)

    def delete_by_username(self, name):
        for student in self.students:
            if student['name'] == name:
                self.students.remove(student)
                return True, '删除成功'
        return False, f'{name} 用户不存在'

    def search_by_username(self, name):
        for student in self.students:
            if student['name'] == name:
                return True, student
        return False, f'{name} 用户不存在'

    def update(self, stu):
        for student in self.students:
            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.search_by_username('你好'))
    print(db.all())

 

5.students.json

[
  {"name":  "张三", "math": "65", "chinese":  "75", "english":  "100"},
  {"name":  "李四", "math": "75", "chinese":  "95", "english":  "91"},
  {"name":  "王五", "math": "99", "chinese":  "85", "english":  "83"}
]

 

6.users.json

[
  {"username":  "admin", "password":  "123456"}
]

 

7.效果

 录入新的信息后

 

 

 

 

 

 更新小明的数据

 

标签:name,python,self,改查,tk,增删,root,frame,pack
From: https://www.cnblogs.com/hmy22466/p/17406794.html

相关文章

  • Python 运算符
    1、算术运算符运算符描述实例+加-两个对象相加a+b输出结果30-减-得到负数或是一个数减去另一个数a-b输出结果-10*乘-两个数相乘或是返回一个被重复若干次的字符串a*b输出结果200/除-x除以yb/a输出结果2%取模-返回除法的余数......
  • python day 04
    字符串(str)作用:用来记录人的名字、家庭住址、性别等描述性质的状态定义字符串:方式1: name='kevin'#用的多方式2 name="kevin"#用的多方式3: name='''kevin'''(当三引号左边有赋值符号和变量名的时候,它是字符串,否则为注释)方式4: name=......
  • 掌握Python开发三部曲
    最近不少人在公众号后台或是微信直接问我Python开发需要掌握哪些或是问有木有书推荐或是问能不能给点电子书这年头最便宜的投资就是买、买、买书不管什么时候最好的提升就看书、看书、看书对于没有Python基础的,建议你买本《Python基础教程》成体系的把Python3所有基础均有涉及,你需......
  • Python数据离散化指南:手写if-elif语句与pandas中cut()方法的实现
    当我们进行数据分析时,有时候需要对数值型数据进行离散化,将其划分为不同的标签或类别。这样做可以方便我们进行统计和分析,并帮助我们更好地理解数据。在本文中,我们将介绍两种常见的离散化方法,并提供实现代码。方法一:使用条件语句第一种方法是使用条件语句来显式地检查输入值x......
  • How to use the Raspberry Pi and Python to control a DHT11 wet and temperate modu
    HowtousetheRaspberryPiandPythontocontrolaDHT11wetandtemperatemoduleAllInOne如何使用树莓派和Python来控制温湿度模块demos(......
  • python高级技术(死锁、递归锁、信号量、Event时间、进程池、线程池、协程)
    一死锁和递归锁(了解)进程也有死锁与递归锁,使用方法类似所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。当你知......
  • Python语法入门
    数据类型(续上)1.字符串(str)不用于计算,仅用于描述,任何数据类型都可以转变为字符串,类似文本的存在。 方式(被引号引起来的部分):   1. name= '蔡敏'   推荐使用   2.  name= "蔡敏"   推荐使用   3. name=  '''蔡敏'''   ......
  • python爬取电影演员数据
    可以使用Python中的BeautifulSoup和Requests库来爬取网络上的电影数据和演员数据。首先需要使用Requests库发送网络请求,获取HTML页面的源代码。然后,使用BeautifulSoup库解析HTML代码,提取需要的数据。下面是一个示例代码,用于从IMDb网站上获取电影"Titanic"的演员列表,以及他们的角......
  • 常用指令—python,cmd,pytorch等
    1.查看当前使用的python解释器查看电脑里有多少个pythonwherepython查看当前使用的python解释器在哪个路径下在cmd中,切换到pythonimportsyssys.executable2.conda查看虚拟环境列表condaenvlist激活具体虚拟环境condaactivate环境名3.pytorchimport......
  • python的文件操作
    1、应用程序直接操作的是文件,对文件进行的所有的操作,都是向操作系统发送系统调用,然后再由操作将其转换成具体的硬盘操作 2、控制文件的读写内容的模式:t和b t文本(默认的模式):读写都以str(unicode为单位)文本文件  必须指定encoding='utf-8'b(二进制/bytes) ......