Python graduation project/necessary for coursework: making a student management system

foreword

Cough cough, I want to know how many other treasures are still busy with the graduation project

How are you getting ready?

insert image description here

Some treasures have learned python for so long, and they still don’t know how to write a student management system by themselves

Oh, what can I do, let me share it with you

Click to get the complete code

insert image description here

Without further ado, let's start

Implementation code

1. Login page

1. Define the login class and initialize the object

First import the modules we need

from main import MainPage

log in page

Bind the artboard to the instance object

self.root = master

self.page Drawing paper displays a rectangular area on the screen, mostly used as a container.

self.page = tk.Frame(self.root)
self.page.pack()
self.root.geometry("300x180")

Mutable variables provided by tkinter to define username and password.

self.username = tk.StringVar()
self.password = tk.StringVar()

Create a label

grid layout

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)python学习交流Q群:690643772 ### 源码领取
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 accepts a function to perform login logic

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. Login function

check login

get account password

name = self.username.get()
pwd = self.password.get()

do not query the database

print(name, pwd)
if name == 'admin' and pwd == '123456':
    tkinter.messagebox.showinfo(title='恭喜',
                                message='登录成功!')

Destroys the content drawn on the current page

self.page.destroy()

Destroys the content drawn on the entire page

self.root.destroy()

page switching

    MainPage(self.root)
else:
    tkinter.messagebox.showinfo(title='错误', message='账户或者密码错误')

3. Window Call
Call the method of this file, run two inputs in this file, and call and execute the data in front of this method outside.

Create an object, the window object, that displays the interface.

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

2. Main page display

1. Define the page class for easy calling.

login interface

源码领取 690643772
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()

Create a top-level menu, display the menu.

def create_page(self):
    python学习交流Q群:690643772 ### 源码领取
    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="关于")

3. Page display

1. Bind each page

There are too many codes and data written together, it is easy to make mistakes and confusion, you can write a file to hold the data view.py

Define the classes of each module in the view.py file

enter

class InputFrame(tk.Frame):  # 继承Frame类 
    def __init__(self, master):
        # 重新父类
        super().__init__(master)
        pass

Inquire

class QueryFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)
        pass

delete

class DeleteFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)

Revise

class ChangeFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)

about

class AboutFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.root = master 

Then bind these data in the main.py file

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. Input

Add relevant content, name and grades to the InputFrame class in the view.py file.

x = IntVar():整型变量,默认是0
x = DoubleVar():浮点型变量,默认是0.0
x = StringVar():字符串变量,默认是""
x = BooleanVar():布尔型变量,True是1,False是0
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()

Write the create_page() function

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)

Bind these data in main.py

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()

Data entry in the view.py file

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)

4. Query data

Add data in QueryFrame() class

  • ttk.Treeview tree view, Baidu
  • shows:
    headings
    tree
    data_list
  • The columns
    value is a list. Each element in the list represents the name of a column identifier. The length of the list is the length of the column.

Inherit the Frame class

class QueryFrame(tk.Frame):  
    def __init__(self, master=None):
        super().__init__(master)

Define the internal variable root

self.root = master  #
columns = ('name', 'chinese', 'math', 'english')
self.tree_view = ttk.Treeview(self, show='headings', columns=columns)

Each data size per cell

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')

Labels and headings above

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()

Refresh data, display data.

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'],
        ))

Display Data

Add in db.py

def all(self):
    return self.students

view.py

Refresh inserted data

  • The first parameter: parent: For a Treeview with a tree bar, parent is the parent node, for a Treeview with only a list bar, parent is generally empty.
  • The second parameter: index: insert position. It can be END or 'end'
    , or it can be a number. If you want the newly inserted item (record) to be the first of a certain node, the index is set to 0, and so on.
  • values: the displayed value and inserted data, this column of data.
self.tree_view.insert('', index + 1, values=(
                stu['name'], stu['chinese'], stu['math'], 								stu['english'],
            ))

Update the page after inserting data refresh

  • map(func,
    lst), apply the incoming function variable func to each element of the lst variable, and form a new list (Python2)/iterator (Python3) to return the result.
  • get_children(item=None)

Returns all sub-items of an item. This sub-item is in the form of a list. If item is not specified, it returns the item of the root directory

for _ in map(self.tree_view.delete, self.tree_view.get_children('')):
            pass

Bind data in the main.py file

	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()

5. Delete data

Add data in the DeleteFrame() class

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. Click Delete to delete data

def _delete(self):
    username = self.username.get()
    flag, message = db.delete_by_name(username)
    self.status.set(message)

Add delete logic in db.py file

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} 不存在'

Bind data in main.py

	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()

6. Modify data

Add data in ChangeFrame() class

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. Query data

Query data logic in db.py file

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

View.py file click query to display data

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. Modify data and update

db.py file update data logic

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 file modify data

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 file for binding

    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()

Seven, about the part

Add data to AboutFrame() in view.py

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 bind data

	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()

Eight, data storage, save information

db.py saves data

create empty json file

import os

file = "students.json"
# 判断文件是否存在,不存在则创建
if not os.path.exists(file):
    open(file, 'w')
    # 报错
    # os.mknod(file)

Python on Windows does not support the mknod function, because there is no concept of node on Windows.

1. Save data

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. Read data

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)

Call the save function in the view.py file to save the completed data.

enter

def recode_student(self):
	db.save_data()

delete

def _delete(self):
    db.save_data()

Revise

def _change(self):
    db.save_data()

at last

The sharing of the article is over here, click on the business card at the end of the article to get the source code, hurry up and study it

Please add a picture description

Guess you like

Origin blog.csdn.net/yxczsz/article/details/129242681