foreword
Cough cough, I want to know how many other treasures are still busy with the graduation project
How are you getting ready?
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
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