运行登录界面即可自动跳转学生管理界面
先把登录界面代码和学生管理代码放在同一个文件夹,
再在这个文件夹创建两个空的users.txt,students.txt文件
即可正常运行
登录界面代码运行效果
登录界面代码
import tkinter as tk
from student_manager import StudentManager
class Login:
# 定义初始化方法,用于创建登录窗口和输入框和按钮
def __init__(self):
# 创建一个登录窗口
self.login_window = tk.Tk()
# 设置窗口标题
self.login_window.title("登录")
# 获取屏幕的宽度和高度
screen_width = self.login_window.winfo_screenwidth()
screen_height = self.login_window.winfo_screenheight()
# 计算屏幕的中心坐标
center_x = screen_width // 2
center_y = screen_height // 2
# 设置窗口的大小和位置
self.login_window.geometry(f"300x200+{center_x-150}+{center_y-100}")
# 设置窗口大小
# self.login_window.geometry("300x200")
# 在登录窗口中创建两个标签,分别显示用户名和密码字段
tk.Label(self.login_window, text="用户名:").place(x=10, y=10)
tk.Label(self.login_window, text="密码:").place(x=10, y=50)
# 在登录窗口中创建两个输入框,用于输入用户名和密码
self.username_var = tk.StringVar()
self.password_var = tk.StringVar()
self.username_entry = tk.Entry(self.login_window, textvariable=self.username_var)
self.password_entry = tk.Entry(self.login_window, textvariable=self.password_var, show="*")
self.username_entry.place(x=60, y=10)
self.password_entry.place(x=60, y=50)
# 在登录窗口中创建两个按钮,分别用于注册和登录
tk.Button(self.login_window, text="登录", command=self.login).place(x=120, y=90)
tk.Button(self.login_window, text="注册", command=self.register).place(x=60, y=90)
# 定义一个方法,用于注册新用户,并将其保存到TXT文档中
def register(self):
# 获取输入框中的内容
username = self.username_var.get()
password = self.password_var.get()
# 判断用户名和密码是否为空
if username and password:
# 打开TXT文档
file = open("users.txt", "a")
# 将用户名和密码保存到TXT文档中
file.write(",".join([username, password]) + "\n")
file.close()
# 弹出一个对话框,显示注册成功的信息
tk.messagebox.showinfo(title="注册成功", message="恭喜你,注册成功!")
else:
# 弹出一个对话框,显示注册失败的信息
tk.messagebox.showerror(title="注册失败", message="用户名或密码不能为空!")
# 定义一个方法,用于登录系统,并验证用户名和密码是否正确
def login(self):
# 获取输入框中的内容
username = self.username_var.get()
password = self.password_var.get()
# 判断用户名和密码是否为空
if username and password:
# 打开TXT文档
file = open("users.txt", "r")
# 逐行读取内容
for line in file:
# 将每一行的内容分割成用户名和密码
user, pwd = line.strip().split(",")
# 判断用户名和密码是否匹配
if username == user and password == pwd:
# 关闭TXT文档
file.close()
# 关闭登录窗口
self.login_window.destroy()
# 创建一个StudentManager对象,进入学生管理系统的界面和功能
student_manager = StudentManager()
return
# 关闭TXT文档
file.close()
# 弹出一个对话框,显示登录失败的信息
tk.messagebox.showerror(title="登录失败", message="用户名或密码错误!")
else:
# 弹出一个对话框,显示登录失败的信息
tk.messagebox.showerror(title="登录失败", message="用户名或密码不能为空!")
# 创建一个Login对象,进入登录界面的功能
login = Login()
# 进入主循环
login.login_window.mainloop()
学生管理运行效果显示 可增删改查
学生管理模块代码
import tkinter as tk
class StudentManager:
# 定义初始化方法,用于创建主窗口和菜单栏
def __init__(self):
# 创建一个主窗口
self.window = tk.Tk()
# 设置窗口标题
self.window.title("学生管理系统")
# 设置窗口大小
# 获取屏幕的宽度和高度
screen_width = self.window.winfo_screenwidth()
screen_height = self.window.winfo_screenheight()
# 计算屏幕的中心坐标
center_x = screen_width // 2
center_y = screen_height // 2
# 设置窗口的大小和位置
self.window.geometry(f"450x300+{center_x-150}+{center_y-100}")
# self.window.geometry("600x400")
# 创建一个菜单栏
self.menubar = tk.Menu(self.window)
# 创建一个增加菜单,并添加到菜单栏
self.add_menu = tk.Menu(self.menubar, tearoff=0)
self.add_menu.add_command(label="添加", command=self.add_student)
self.menubar.add_cascade(label="添加", menu=self.add_menu)
# 创建一个删除菜单,并添加到菜单栏
self.delete_menu = tk.Menu(self.menubar, tearoff=0)
self.delete_menu.add_command(label="删除", command=self.delete_student)
self.menubar.add_cascade(label="删除", menu=self.delete_menu)
# 创建一个修改菜单,并添加到菜单栏
self.update_menu = tk.Menu(self.menubar, tearoff=0)
self.update_menu.add_command(label="修改", command=self.update_student)
self.menubar.add_cascade(label="修改", menu=self.update_menu)
# 创建一个查询菜单,并添加到菜单栏
self.query_menu = tk.Menu(self.menubar, tearoff=0)
self.query_menu.add_command(label="查询", command=self.query_student)
self.menubar.add_cascade(label="查询", menu=self.query_menu)
# 创建一个退出菜单,并添加到菜单栏
self.quit_menu = tk.Menu(self.menubar, tearoff=0)
self.quit_menu.add_command(label="退出", command=self.quit)
self.menubar.add_cascade(label="退出", menu=self.quit_menu)
# 将菜单栏添加到主窗口
self.window.config(menu=self.menubar)
# 创建一个文本框
self.text = tk.Text(self.window)
# 创建一个滚动条
self.scroll = tk.Scrollbar(self.window)
# 将滚动条绑定到文本框
self.scroll.config(command=self.text.yview)
self.text.config(yscrollcommand=self.scroll.set)
# 将文本框和滚动条放置到主窗口中
self.text.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
self.scroll.pack(side=tk.RIGHT, fill=tk.Y)
# 从TXT文档中读取学生的信息,并显示在文本框中
self.load_data()
# 定义增加学生的方法,用于创建一个新的窗口,用于输入学生的信息
def add_student(self):
# 创建一个新的窗口,用于输入学生的信息
self.add_window = tk.Toplevel(self.window)
# 设置新窗口的标题和大小
self.add_window.title("增加学生")
self.add_window.geometry("300x400")
# 在新窗口中创建八个标签,分别显示学号、姓名、年龄、性别、班级等字段和语文、数学、信息等科目的成绩
tk.Label(self.add_window, text="学号:").place(x=10, y=10)
tk.Label(self.add_window, text="姓名:").place(x=10, y=50)
tk.Label(self.add_window, text="年龄:").place(x=10, y=90)
tk.Label(self.add_window, text="性别:").place(x=10, y=130)
tk.Label(self.add_window, text="班级:").place(x=10, y=170)
tk.Label(self.add_window, text="语文:").place(x=10, y=210)
tk.Label(self.add_window, text="数学:").place(x=10, y=250)
tk.Label(self.add_window, text="信息:").place(x=10, y=290)
# 在新窗口中创建八个输入框,用于输入学生的信息和语文、数学、信息等科目的成绩
self.id_var = tk.StringVar()
self.name_var = tk.StringVar()
self.age_var = tk.StringVar()
self.gender_var = tk.StringVar()
self.class_var = tk.StringVar()
self.chinese_var = tk.StringVar()
self.math_var = tk.StringVar()
self.info_var = tk.StringVar()
self.id_entry = tk.Entry(self.add_window, textvariable=self.id_var)
self.name_entry = tk.Entry(self.add_window, textvariable=self.name_var)
self.age_entry = tk.Entry(self.add_window, textvariable=self.age_var)
self.gender_entry = tk.Entry(self.add_window, textvariable=self.gender_var)
self.class_entry = tk.Entry(self.add_window, textvariable=self.class_var)
self.chinese_entry = tk.Entry(self.add_window, textvariable=self.chinese_var)
self.math_entry = tk.Entry(self.add_window, textvariable=self.math_var)
self.info_entry = tk.Entry(self.add_window, textvariable=self.info_var)
self.id_entry.place(x=60, y=10)
self.name_entry.place(x=60, y=50)
self.age_entry.place(x=60, y=90)
self.gender_entry.place(x=60, y=130)
self.class_entry.place(x=60, y=170)
self.chinese_entry.place(x=60, y=210)
self.math_entry.place(x=60, y=250)
self.info_entry.place(x=60, y=290)
# 在新窗口中创建一个按钮,用于提交学生的信息
tk.Button(self.add_window, text="提交", command=self.submit).place(x=120, y=330)
# 定义一个方法,用于获取输入框中的内容,并将其保存到TXT文档中,并更新文本框中的内容
def submit(self):
# 获取输入框中的内容
id_ = self.id_var.get()
name = self.name_var.get()
age = self.age_var.get()
gender = self.gender_var.get()
class_ = self.class_var.get()
chinese = self.chinese_var.get()
math = self.math_var.get()
info = self.info_var.get()
# 将输入框中的内容保存到TXT文档中
file = open("students.txt", "a")
file.write(",".join([id_, name, age, gender, class_, chinese, math, info]) + "\n")
file.close()
# 更新文本框中的内容
self.clear_data()
self.load_data()
# 定义一个方法,用于从TXT文档中读取学生的信息,并显示在文本框中
def load_data(self):
# 打开TXT文档
file = open("students.txt", "r")
# 逐行读取内容
for line in file:
# 将每一行的信息分割成学号、姓名、年龄、性别、班级等字段和语文、数学、信息等科目的成绩
id_, name, age, gender, class_, chinese, math, info = line.strip().split(",")
# 用制表符连接起来
data = "\t".join([id_, name, age, gender, class_, chinese, math, info])
# 将每一行的信息插入到文本框中,并换行
self.text.insert(tk.END, data + "\n")
# 关闭TXT文档
file.close()
# 定义一个方法,用于修改一个学生的信息,并更新到TXT文档中
def update_student(self):
# 创建一个新的窗口,用于输入要修改的学生的学号
self.update_window = tk.Toplevel(self.window)
# 设置新窗口的标题和大小
self.update_window.title("修改学生")
self.update_window.geometry("300x100")
# 在新窗口中创建一个标签,显示学号字段
tk.Label(self.update_window, text="学号:").place(x=10, y=10)
# 在新窗口中创建一个输入框,用于输入要修改的学生的学号
self.id_var = tk.StringVar()
self.id_entry = tk.Entry(self.update_window, textvariable=self.id_var)
self.id_entry.place(x=60, y=10)
# 在新窗口中创建一个按钮,用于查询要修改的学生的信息
tk.Button(self.update_window, text="查询", command=self.modify).place(x=120, y=50)
# 定义一个方法,用于获取输入框中的内容,并从TXT文档中查找,并弹出一个窗口,显示要修改的学生的信息
def modify(self):
# 获取输入框中的内容
id_ = self.id_var.get()
# 从TXT文档中查找
file = open("students.txt", "r")
lines = file.readlines()
file.close()
# 创建一个对话框,用于显示要修改的学生的信息
self.modify_result = tk.Toplevel(self.window)
# 设置对话框的标题和大小
self.modify_result.title("修改结果")
self.modify_result.geometry("400x400")
# 在对话框中创建八个标签,分别显示学号、姓名、年龄、性别、班级等字段和语文、数学、信息等科目的成绩
# tk.Label(self.modify_result, text="学号:").place(x=10, y=10)
tk.Label(self.modify_result, text="姓名:").place(x=10, y=50)
tk.Label(self.modify_result, text="年龄:").place(x=10, y=90)
tk.Label(self.modify_result, text="性别:").place(x=10, y=130)
tk.Label(self.modify_result, text="班级:").place(x=10, y=170)
tk.Label(self.modify_result, text="语文:").place(x=10, y=210)
tk.Label(self.modify_result, text="数学:").place(x=10, y=250)
tk.Label(self.modify_result, text="信息:").place(x=10, y=290)
# 在对话框中创建八个输入框,用于显示和修改要修改的学生的信息和语文、数学、信息等科目的成绩
self.name_var = tk.StringVar()
self.age_var = tk.StringVar()
self.gender_var = tk.StringVar()
self.class_var = tk.StringVar()
self.chinese_var = tk.StringVar()
self.math_var = tk.StringVar()
self.info_var = tk.StringVar()
self.name_entry = tk.Entry(self.modify_result, textvariable=self.name_var)
self.age_entry = tk.Entry(self.modify_result, textvariable=self.age_var)
self.gender_entry = tk.Entry(self.modify_result, textvariable=self.gender_var)
self.class_entry = tk.Entry(self.modify_result, textvariable=self.class_var)
self.chinese_entry = tk.Entry(self.modify_result, textvariable=self.chinese_var)
self.math_entry = tk.Entry(self.modify_result, textvariable=self.math_var)
self.info_entry = tk.Entry(self.modify_result, textvariable=self.info_var)
self.name_entry.place(x=60, y=50)
self.age_entry.place(x=60, y=90)
self.gender_entry.place(x=60, y=130)
self.class_entry.place(x=60, y=170)
self.chinese_entry.place(x=60, y=210)
self.math_entry.place(x=60, y=250)
self.info_entry.place(x=60, y=290)
# 在对话框中创建一个按钮,用于更新要修改的学生的信息
tk.Button(self.modify_result, text="更新", command=lambda: self.update(id_, self.name_var, self.age_var, self.gender_var, self.class_var, self.chinese_var, self.math_var, self.info_var)).place(x=120, y=330)
# 显示在输入框中
for line in lines:
if line.startswith(id_ + ","):
# 将每一行的信息分割成学号、姓名、年龄、性别、班级等字段和语文、数学、信息等科目的成绩
id_, name, age, gender, class_, chinese, math, info = line.strip().split(",")
# 将每一行的信息显示在输入框中
self.name_var.set(name)
self.age_var.set(age)
self.gender_var.set(gender)
self.class_var.set(class_)
self.chinese_var.set(chinese)
self.math_var.set(math)
self.info_var.set(info)
# 定义一个方法,用于获取输入框中的内容,并更新到TXT文档中,并更新文本框中的内容
def update(self, id_, name_var, age_var, gender_var, class_var, chinese_var, math_var, info_var):
# 获取输入框中的内容
name = name_var.get()
age = age_var.get()
gender = gender_var.get()
class_ = class_var.get()
chinese = chinese_var.get()
math = math_var.get()
info = info_var.get()
# 更新到TXT文档中
file = open("students.txt", "r")
lines = file.readlines()
file.close()
file = open("students.txt", "w")
for line in lines:
if line.startswith(id_ + ","):
file.write(",".join([id_, name, age, gender, class_, chinese, math, info]) + "\n")
else:
file.write(line)
file.close()
# 更新文本框中的内容
self.clear_data()
self.load_data()
# 定义一个方法,用于删除一个学生的信息,并从TXT文档中移除
def delete_student(self):
# 创建一个新的窗口,用于输入要删除的学生的姓名
self.delete_window = tk.Toplevel(self.window)
# 设置新窗口的标题和大小
self.delete_window.title("删除学生")
self.delete_window.geometry("300x100")
# 在新窗口中创建一个标签,显示姓名字段
tk.Label(self.delete_window, text="学号:").place(x=10, y=10)
# 在新窗口中创建一个输入框,用于输入要删除的学生的姓名
self.name_var = tk.StringVar()
self.name_entry = tk.Entry(self.delete_window, textvariable=self.name_var)
self.name_entry.place(x=60, y=10)
# 在新窗口中创建一个按钮,用于删除学生的信息
tk.Button(self.delete_window, text="删除", command=self.remove).place(x=120, y=50)
# 定义一个方法,用于获取输入框中的内容,并从TXT文档中移除,并更新文本框中的内容
def remove(self):
# 获取输入框中的内容
name = self.name_var.get()
# 从TXT文档中移除
file = open("students.txt", "r")
lines = file.readlines()
file.close()
file = open("students.txt", "w")
for line in lines:
if not line.startswith(name + ","):
file.write(line)
file.close()
# 更新文本框中的内容
self.clear_data()
self.load_data()
# 定义一个方法,用于查询一个学生的信息,并显示在文本框中
def query_student(self):
# 创建一个新的窗口,用于输入要查询的学生的姓名
self.query_window = tk.Toplevel(self.window)
# 设置新窗口的标题和大小
self.query_window.title("查询学生")
self.query_window.geometry("300x100")
# 在新窗口中创建一个标签,显示姓名字段
tk.Label(self.query_window, text="学号:").place(x=10, y=10)
# 在新窗口中创建一个输入框,用于输入要查询的学生的姓名
self.name_var = tk.StringVar()
self.name_entry = tk.Entry(self.query_window, textvariable=self.name_var)
self.name_entry.place(x=60, y=10)
# 在新窗口中创建一个按钮,用于查询学生的信息
tk.Button(self.query_window, text="查询", command=self.search).place(x=120, y=50)
# 定义一个方法,用于获取输入框中的内容,并从TXT文档中查找,并显示在文本框中
def search(self):
# 获取输入框中的内容
name = self.name_var.get()
# 从TXT文档中查找
file = open("students.txt", "r")
lines = file.readlines()
file.close()
# 清空文本框中的内容
# self.clear_data()
# 创建一个对话框,用于显示查询的结果
self.query_result = tk.Toplevel(self.window)
# 设置对话框的标题和大小
self.query_result.title("查询结果")
self.query_result.geometry("400x300")
# 在对话框中创建一个文本框,用于显示查询的结果
self.result_text = tk.Text(self.query_result)
# 在对话框中创建一个滚动条,用于滚动文本框
self.result_scroll = tk.Scrollbar(self.query_result)
# 将滚动条绑定到文本框
self.result_scroll.config(command=self.result_text.yview)
self.result_text.config(yscrollcommand=self.result_scroll.set)
# 将文本框和滚动条放置到对话框中
self.result_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
self.result_scroll.pack(side=tk.RIGHT, fill=tk.Y)
# 插入表头行
header = "\t".join(["姓名", "年龄", "性别", "班级", "语文", "数学", "信息"])
self.result_text.insert(tk.END, header + "\n")
# 显示在文本框中
for line in lines:
if line.startswith(name + ","):
# 将每一行的信息分割成姓名、年龄、性别、班级等字段和语文、数学、信息等科目的成绩
id_, name, age, gender, class_, chinese, math, info = line.strip().split(",")
# 用制表符连接起来
data = "\t".join([name, age, gender, class_, chinese, math, info])
# 将每一行的信息插入到文本框中,并换行
self.result_text.insert(tk.END, data + "\n")
# 定义一个方法,用于退出程序,并关闭所有的窗口
def quit(self):
# 调用主窗口的destroy方法,将主窗口和所有的子窗口都关闭
self.window.destroy()
# 定义一个方法,用于清空文本框中的内容
def clear_data(self):
# 调用文本框的delete方法,将文本框中的所有内容删除
self.text.delete(1.0, tk.END)
#创建一个StudentManager对象
student_manager = StudentManager()
# 进入主循环
student_manager.window.mainloop()