Python Tkinter 学生信息管理系统
import tkinter as tk from tkinter import messagebox import mysql.connector
创建登录窗口
def show_login_window(): login_window = tk.Tk() login_window.title('登录') login_window.geometry('250x140')
label_username = tk.Label(login_window, text='用户名:')
label_username.grid(row=0, column=0, padx=6, pady=12)
entry_username = tk.Entry(login_window)
entry_username.grid(row=0, column=1, padx=6, pady=12)
label_password = tk.Label(login_window, text='密码:')
label_password.grid(row=1, column=0, padx=6, pady=12)
entry_password = tk.Entry(login_window, show='*')
entry_password.grid(row=1, column=1, padx=6, pady=12)
def login():
'验证登录信息,并关闭登录窗口'
username = entry_username.get()
password = entry_password.get()
if username == 'admin' and password == 'admin':
login_window.destroy()
show_main_window()
else:
messagebox.showerror('错误', '用户名或密码错误')
button_login = tk.Button(login_window, text='登录', command=login)
button_login.grid(row=2, columnspan=2, pady=12)
login_window.mainloop()
def show_main_window(): main_window = tk.Tk() main_window.title('学生信息管理系统') main_window.geometry('550x460')
cnx = mysql.connector.connect(user='root', password='cry33120217', host='localhost',
port='3306', database='abc')
cursor = cnx.cursor()
# 菜单栏
menubar = tk.Menu(main_window)
main_window.config(menu=menubar)
def show_operation_window():
operation_window = tk.Tk()
operation_window.title('学生信息管理系统 - 操作')
operation_window.geometry('400x300')
# 添加、修改、删除学生信息
add_frame = tk.Frame(operation_window)
add_frame.pack(pady=12)
label_id_add = tk.Label(add_frame, text='学号:')
label_id_add.grid(row=0, column=0, padx=4)
entry_id = tk.Entry(add_frame)
entry_id.grid(row=0, column=1, padx=4)
label_name_add = tk.Label(add_frame, text='姓名:')
label_name_add.grid(row=1, column=0, padx=4)
entry_name = tk.Entry(add_frame)
entry_name.grid(row=1, column=1, padx=4)
label_gender_add = tk.Label(add_frame, text='性别:')
label_gender_add.grid(row=2, column=0, padx=4)
entry_gender = tk.Entry(add_frame)
entry_gender.grid(row=2, column=1, padx=4)
label_age_add = tk.Label(add_frame, text='年龄:')
label_age_add.grid(row=3, column=0, padx=4)
entry_age = tk.Entry(add_frame)
entry_age.grid(row=3, column=1, padx=4)
def update_student_info():
'更新学生信息'
selected_item = listbox.curselection()
if not selected_item:
messagebox.showerror('错误', '请选择要更新的学生信息')
return
student_info = listbox.get(selected_item)
id = student_info.split()[0]
name = entry_name.get()
gender = entry_gender.get()
age = entry_age.get()
try:
cursor.execute('UPDATE students SET name=%s, gender=%s, age=%s WHERE id=%s',
(name, gender, age, id))
cnx.commit()
query_students()
clear_entries()
messagebox.showinfo('提示', '学生信息更新成功')
except Exception as e:
messagebox.showerror('错误', f'更新失败:{e}')
def delete_student_info():
'删除学生信息'
selected_item = listbox.curselection()
if not selected_item:
messagebox.showerror('错误', '请选择要删除的学生信息')
return
student_info = listbox.get(selected_item)
id = student_info.split()[0]
confirm = messagebox.askyesno('确认', '确定要删除该学生信息吗?')
if confirm:
try:
cursor.execute('DELETE FROM students WHERE id=%s', (id,))
cnx.commit()
query_students()
clear_entries()
messagebox.showinfo('提示', '学生信息删除成功')
except Exception as e:
messagebox.showerror('错误', f'删除失败:{e}')
def insert_student_info():
'添加学生信息'
id = entry_id.get().strip()
name = entry_name.get().strip()
gender = entry_gender.get().strip()
age = entry_age.get().strip()
if not id or not name or not gender or not age:
messagebox.showerror('错误', '学生信息不能为空')
return
try:
cursor.execute('INSERT INTO students values(%s, %s, %s, %s)', (id, name, gender, age))
cnx.commit()
query_students()
clear_entries()
messagebox.showinfo('提示', '学生信息添加成功')
except Exception as e:
messagebox.showerror('错误', f'添加失败:{e}')
def clear_entries():
'清空文本框'
entry_id.delete(0, tk.END)
entry_name.delete(0, tk.END)
entry_gender.delete(0, tk.END)
entry_age.delete(0, tk.END)
button_add = tk.Button(add_frame, text='添加', command=insert_student_info)
button_add.grid(row=4, columnspan=2, pady=12)
button_update = tk.Button(add_frame, text='更新', command=update_student_info)
button_update.grid(row=5, columnspan=2, pady=12)
button_delete = tk.Button(add_frame, text='删除', command=delete_student_info)
button_delete.grid(row=6, columnspan=2, pady=12)
button_clear = tk.Button(add_frame, text='清空', command=clear_entries)
button_clear.grid(row=7, columnspan=2, pady=12)
query_students()
operation_window.mainloop()
# 操作按钮
button_operation = tk.Button(main_window, text='操作', command=show_operation_window)
button_operation.pack(pady=12)
# 学生信息表格
data_frame = tk.Frame(main_window)
data_frame.pack(pady=12)
label_id = tk.Label(data_frame, text='学号')
label_id.grid(row=0, column=0, padx=4)
label_name = tk.Label(data_frame, text='姓名')
label_name.grid(row=0, column=1, padx=4)
label_gender = tk.Label(data_frame, text='性别')
label_gender.grid(row=0, column=2, padx=4)
label_age = tk.Label(data_frame, text='年龄')
label_age.grid(row=0, column=3, padx=4)
listbox = tk.Listbox(data_frame, width=40)
listbox.grid(row=1, columnspan=4)
scrollbar = tk.Scrollbar(data_frame)
scrollbar.grid(row=1, column=4, sticky='NS')
listbox.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=listbox.yview)
def query_students():
'查询所有学生信息'
id = entry_id_filter.get().strip()
name = entry_name_filter.get().strip()
gender = var_gender.get()
age_min = entry_age_min.get().strip()
sql = 'SELECT * FROM students WHERE 1=1'
if id:
sql += f' AND id='{id}'
if name:
sql += f' AND name LIKE '%{name}%''
if gender:
sql += f' AND gender='{gender}'
if age_min:
sql += f' AND age>={age_min}'
cursor.execute(sql)
students = cursor.fetchall()
listbox.delete(0, tk.END)
for student in students:
listbox.insert(tk.END, f'{student[0]} {student[1]} {student[2]} {student[3]}')
# 添加筛选条件
filter_frame = tk.Frame(main_window)
filter_frame.pack(pady=12)
label_id_filter = tk.Label(filter_frame, text='学号:')
label_id_filter.grid(row=0, column=0, padx=4)
entry_id_filter = tk.Entry(filter_frame)
entry_id_filter.grid(row=0, column=1, padx=4)
label_name_filter = tk.Label(filter_frame, text='姓名:')
label_name_filter.grid(row=1, column=0, padx=4)
entry_name_filter = tk.Entry(filter_frame)
entry_name_filter.grid(row=1, column=1, padx=4)
label_gender_filter = tk.Label(filter_frame, text='性别:')
label_gender_filter.grid(row=2, column=0, padx=4)
var_gender = tk.StringVar()
var_gender.set('')
radio_male = tk.Radiobutton(filter_frame, text='男', variable=var_gender, value='男')
radio_male.grid(row=2, column=1)
radio_female = tk.Radiobutton(filter_frame, text='女', variable=var_gender, value='女')
radio_female.grid(row=2, column=2)
label_age_range = tk.Label(filter_frame, text='年龄范围:')
label_age_range.grid(row=3, column=0, padx=4)
entry_age_min = tk.Entry(filter_frame)
entry_age_min.grid(row=3, column=1, padx=4)
label_age_to = tk.Label(filter_frame, text='至')
label_age_to.grid(row=3, column=2, padx=4)
entry_age_max = tk.Entry(filter_frame)
entry_age_max.grid(row=3, column=3, padx=4)
button_filter = tk.Button(filter_frame, text='筛选', command=query_students)
button_filter.grid(row=4, columnspan=4, pady=12)
query_students()
main_window.mainloop()
cursor.close()
cnx.close()
if name == 'main': show_login_window() 可能添加失败内容:可能是因为以下原因导致添加失败:
-
数据库连接失败:请确保数据库连接信息正确,包括用户名、密码、主机名、端口号、数据库名等。
-
学号已存在:请检查要添加的学生学号是否已经存在于数据库中,学号应该是唯一的。
-
数据类型错误:请检查要添加的学生信息是否符合数据库定义的数据类型,比如年龄应该是整型。
-
其他原因:如果以上几点都没有问题,可能是其他未知原因导致添加失败,可以尝试查看数据库报错信息,或者调试代码查找问题。
原文地址: https://www.cveoy.top/t/topic/oqCg 著作权归作者所有。请勿转载和采集!