翼度科技»论坛 编程开发 python 查看内容

[Python急救站]学生管理系统链接数据库

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
相信很多人在初学Python的时候,经常最后作业就是完成一个学生管理系统,但是我们来做一个完美的学生管理系统,并且将数据储存到数据库里。
我们先看看我们的数据库怎么设置。
首先呢,我选择用的是SQL Server
然后,我们的数据库名称为学生管理系统

 接着,新建一张表,我设置表的名称为学生信息表。

最后,去设置表的列名和类型,我的设置如下:

接下来,我们开始做Python代码啦。
1.我们的导入库有:
  1. from tkinter import *
  2. from tkinter.messagebox import askokcancel, showinfo
  3. import tkinter.ttk as ttk
  4. import pyodbc
  5. import os
  6. import logging
  7. import pandas as pd
  8. from tkinter.filedialog import askopenfilename
复制代码
2.链接到SQL Server:
  1. # 连接到 SQL ServerConnect to SQL Server
  2. cn = pyodbc.connect('DRIVER={SQL Server};SERVER=(local);DATABASE=学生管理系统;UID=LYD\\lyd;Trusted_Connection=yes
复制代码
注意:这里面要注意的是因为我的服务器名称是(local)如果你有其他服务器,那么只要在SERVER=(local)中,改成你的服务器名称。然后我的用户名为LYD\lyd,用户名在UID=LYD\\lyd中更改。然后我没有,如果你有就去改一下就好了
3.GUI界面的设置:
  1. def main():
  2.     root.geometry('800x600')  # 设置窗口初始大小
  3.     root.title(systitle)  # 设置系统标题
  4.     # 创建系统菜单
  5.     menubar = Menu(root)  # 创建Menu对象menubar,将作为root窗口中的菜单
  6.     root.config(menu=menubar)  # 将menubar菜单作为root窗口的顶层菜单栏
  7.     # menuStudent将作为menubar菜单的子菜单
  8.     menuStudent = Menu(menubar, tearoff=0)
  9.     menuStudent.add_command(label='添加新学生', font=('宋体', 10), command=addStudent)
  10.     menuStudent.add_command(label='显示全部学生信息', font=('宋体', 10), command=showAllStudent)
  11.     menuStudent.add_command(label='查找/修改/删除学生信息', font=('宋体', 10), command=checkUpdateStudent)
  12.     menuStudent.add_command(label='批量导入学生信息', font=('宋体', 10), command=importStudents)
  13.     # 菜单file添加为menubar的子菜单
  14.     menubar.add_cascade(label='学生管理', font=('宋体', 10), menu=menuStudent)
  15.     menuHelp = Menu(menubar, tearoff=0)  # help将作为menubar菜单的子菜单
  16.     menuHelp.add_command(label='查看日志', font=('宋体', 10), command=viewLog)
  17.     menuHelp.add_command(label='关于我们', font=('宋体', 10), command=about)
  18.     # 菜单help添加为menubar的子菜单
  19.     menubar.add_cascade(label='其他', font=('宋体', 10), menu=menuHelp)
  20.     menubar.add_command(label='退出', font=('宋体', 10), command=root.quit)
  21.     root.mainloop()
复制代码
4.设置添加新学生信息:
  1. def addStudent():
  2.     for widget in operateFrame.winfo_children():  # 清空窗口中原有的所有内容
  3.         widget.destroy()
  4.     f1 = Frame(operateFrame)
  5.     f1.pack()
  6.     studentIdVar = StringVar()
  7.     studentNameVar = StringVar()
  8.     idCardVar = StringVar()
  9.     telVar = StringVar()
  10.     lStudentId = Label(f1, text='学号:')
  11.     lStudentName = Label(f1, text='姓名:')
  12.     lIdCard = Label(f1, text='身份证号码:')
  13.     lTel = Label(f1, text='手机号:')
  14.     tStudentId = Entry(f1, textvariable=studentIdVar)
  15.     tStudentName = Entry(f1, textvariable=studentNameVar)
  16.     tIdCard = Entry(f1, textvariable=idCardVar)
  17.     tTel = Entry(f1, textvariable=telVar)
  18.     lStudentId.grid(row=1, column=1)
  19.     lStudentName.grid(row=2, column=1)
  20.     lIdCard.grid(row=3, column=1)
  21.     lTel.grid(row=4, column=1)
  22.     tStudentId.grid(row=1, column=2)
  23.     tStudentName.grid(row=2, column=2)
  24.     tIdCard.grid(row=3, column=2)
  25.     tTel.grid(row=4, column=2)
  26.     f2 = Frame(operateFrame)
  27.     f2.pack(pady=20)
  28.     bReset = Button(f2, text='重置')
  29.     bSave = Button(f2, text='保存')
  30.     bReset.grid(row=1, column=1)
  31.     bSave.grid(row=1, column=2)
  32.     # 记录用户操作
  33.     logging.info('用户执行了添加新学生操作')
  34.     def reset():
  35.         studentIdVar.set('')
  36.         studentNameVar.set('')
  37.         idCardVar.set('')
  38.         telVar.set('')
  39.     bReset.config(command=reset)
  40.     def save():
  41.         try:
  42.             id = studentIdVar.get()
  43.             if not id.isdigit():
  44.                 raise Exception('学号必须为数字!')
  45.             name = studentNameVar.get()
  46.             id_card = idCardVar.get()
  47.             if len(id_card) != 18:
  48.                 raise Exception('身份证号码必须是18位!')
  49.             tel = telVar.get()
  50.             if len(tel) != 11:
  51.                 raise Exception('手机号必须是11位!')
  52.             # 向数据库发送插入指令
  53.             cursor = cn.cursor()
  54.             cursor.execute('INSERT INTO 学生信息表 VALUES (?, ?, ?, ?)', (id, name, id_card, tel))
  55.             cn.commit()
  56.             showinfo('提示', '保存成功!')
  57.         except Exception as e:
  58.             showinfo('错误', str(e))
  59.     bSave.config(command=save)
复制代码
5.设置显示全部学生信息:
  1. def showAllStudent():
  2.     # 清空窗口中原有的所有内容
  3.     for widget in operateFrame.winfo_children():
  4.         widget.destroy()
  5.     # 创建表格
  6.     tree = ttk.Treeview(operateFrame)
  7.     tree["columns"] = ("学号", "姓名", "身份证号码", "手机号")
  8.     tree.column("学号", width=100)
  9.     tree.column("姓名", width=100)
  10.     tree.column("身份证号码", width=150)
  11.     tree.column("手机号", width=100)
  12.     tree.heading("学号", text="学号")
  13.     tree.heading("姓名", text="姓名")
  14.     tree.heading("身份证号码", text="身份证号码")
  15.     tree.heading("手机号", text="手机号")
  16.     tree.pack(side=LEFT, fill=Y)
  17.     # 从数据库中获取学生信息
  18.     cursor = cn.cursor()
  19.     cursor.execute("SELECT * FROM 学生信息表")
  20.     rows = cursor.fetchall()
  21.     # 在表格中显示学生信息
  22.     for row in rows:
  23.         tree.insert("", "end", values=row)
  24.     # 记录用户操作
  25.     logging.info('用户执行了显示全部学生信息操作')
复制代码
6.设置查找/修改/删除学生信息:
  1. def checkUpdateStudent():
  2.     for widget in operateFrame.winfo_children():
  3.         widget.destroy()
  4.     f1 = Frame(operateFrame)
  5.     f1.pack()
  6.     searchVar = StringVar()
  7.     searchLabel = Label(f1, text='请输入学号:')
  8.     searchEntry = Entry(f1, textvariable=searchVar)
  9.     searchButton = Button(f1, text='搜索', command=lambda: searchStudent(searchVar.get()))
  10.     searchLabel.grid(row=1, column=1)
  11.     searchEntry.grid(row=1, column=2)
  12.     searchButton.grid(row=1, column=3)
  13.     def searchStudent(studentId):
  14.         # 在数据库中搜索学生信息
  15.         cursor = cn.cursor()
  16.         cursor.execute("SELECT * FROM 学生信息表 WHERE 学号=?", (studentId,))
  17.         row = cursor.fetchone()
  18.         # 记录用户操作
  19.         logging.info('用户执行了查找/修改/删除学生信息操作')
  20.         if row:
  21.             showStudentInfo(row)
  22.         else:
  23.             showinfo('提示', '未找到该学生信息!')
  24.     def showStudentInfo(studentInfo):
  25.         # 清空窗口中原有的所有内容
  26.         for i in operateFrame.winfo_children():
  27.             i.destroy()
  28.         f2 = Frame(operateFrame)
  29.         f2.pack()
  30.         studentIdVar = StringVar(value=studentInfo[0])
  31.         studentNameVar = StringVar(value=studentInfo[1])
  32.         idCardVar = StringVar(value=studentInfo[2])
  33.         telVar = StringVar(value=studentInfo[3])
  34.         lStudentId = Label(f2, text='学号:')
  35.         lStudentName = Label(f2, text='姓名:')
  36.         lIdCard = Label(f2, text='身份证号码:')
  37.         lTel = Label(f2, text='手机号:')
  38.         tStudentId = Entry(f2, textvariable=studentIdVar, state='readonly')
  39.         tStudentName = Entry(f2, textvariable=studentNameVar)
  40.         tIdCard = Entry(f2, textvariable=idCardVar)
  41.         tTel = Entry(f2, textvariable=telVar)
  42.         lStudentId.grid(row=1, column=1)
  43.         lStudentName.grid(row=2, column=1)
  44.         lIdCard.grid(row=3, column=1)
  45.         lTel.grid(row=4, column=1)
  46.         tStudentId.grid(row=1, column=2)
  47.         tStudentName.grid(row=2, column=2)
  48.         tIdCard.grid(row=3, column=2)
  49.         tTel.grid(row=4, column=2)
  50.         f3 = Frame(operateFrame)
  51.         f3.pack(pady=20)
  52.         bUpdate = Button(f3, text='更新',
  53.                          command=lambda: updateStudent(studentIdVar.get(), studentNameVar.get(), idCardVar.get(),
  54.                                                        telVar.get()))
  55.         bDelete = Button(f3, text='删除', command=lambda: deleteStudent(studentIdVar.get()))
  56.         bUpdate.grid(row=1, column=1)
  57.         bDelete.grid(row=1, column=2)
  58.     def updateStudent(studentId, studentName, idCard, tel):
  59.         try:
  60.             if not studentId.isdigit():
  61.                 raise Exception('学号必须为数字!')
  62.             if len(idCard) != 18:
  63.                 raise Exception('身份证号码必须是18位!')
  64.             if len(tel) != 11:
  65.                 raise Exception('手机号必须是11位!')
  66.             # 更新数据库中的学生信息
  67.             cursor = cn.cursor()
  68.             cursor.execute('UPDATE 学生信息表 SET 姓名=?, 身份证号码=?, 手机号=? WHERE 学号=?',
  69.                            (studentName, idCard, tel, studentId))
  70.             cn.commit()
  71.             showinfo('提示', '更新成功!')
  72.         except Exception as e:
  73.             showinfo('错误', str(e))
  74.     def deleteStudent(studentId):
  75.         result = askokcancel('确认', '确定要删除该学生信息吗?')
  76.         if result:
  77.             # 删除数据库中的学生信息
  78.             cursor = cn.cursor()
  79.             cursor.execute('DELETE FROM 学生信息表 WHERE 学号=?', (studentId,))
  80.             cn.commit()
  81.             showinfo('提示', '删除成功!')
  82.             searchVar.set('')
  83.     searchEntry.focus_set()
复制代码
7.设置批量导入学生信息
  1. def importStudents():
  2.     # 要求用户选择一个 Excel 文件
  3.     file_path = askopenfilename(filetypes=[('Excel Files', '*.xlsx')])
  4.     if file_path:
  5.         try:
  6.             # 将 Excel 文件读入 pandas DataFrame 中
  7.             df = pd.read_excel(file_path)
  8.             # 循环访问 DataFrame 中的每一行
  9.             for _, row in df.iterrows():
  10.                 student_id = str(row['学号'])
  11.                 student_name = str(row['姓名'])
  12.                 id_card = str(row['身份证号码'])
  13.                 tel = str(row['手机号'])
  14.                 # 检查数据库中是否已存在学生
  15.                 cursor = cn.cursor()
  16.                 cursor.execute("SELECT * FROM 学生信息表 WHERE 学号=?", (student_id,))
  17.                 existing_student = cursor.fetchone()
  18.                 if existing_student:
  19.                     # Student 已存在,跳过导入
  20.                     continue
  21.                 # 将学生插入数据库
  22.                 cursor.execute('INSERT INTO 学生信息表 VALUES (?, ?, ?, ?)', (student_id, student_name, id_card, tel))
  23.                 cn.commit()
  24.             showinfo('提示', '批量导入成功!')
  25.         except Exception as e:
  26.             showinfo('错误', str(e))
  27.     else:
  28.         showinfo('提示', '未选择文件!')
  29.     # 记录用户操作
  30.     logging.info('用户执行了批量导入学生信息')
复制代码
注意:批量导入信息需要提供Excel 文件,这个时候要下载另一个库:openpyxl。看名字就知道是用于Python打开Excel 文件的库。虽然在程序里面没有直接调用,但是如果没有这个库,在运行时功能时就使用不了。Excel 文件模版如下:

以上的就是学生管理模块功能。
8.设置查看日志:
  1. def viewLog():
  2.     # 获取当前工程目录
  3.     project_dir = os.getcwd()
  4.     # 设置日志文件路径
  5.     log_file_path = os.path.join(project_dir, '日志文件.txt')
  6.     # 如果日志文件所在目录不存在,则创建该目录
  7.     log_dir = os.path.dirname(log_file_path)
  8.     if not os.path.exists(log_dir):
  9.         os.makedirs(log_dir)
  10.     # 打开日志文件,进行日志记录
  11.     # 设置日志记录器
  12.     logging.basicConfig(filename='日志文件.txt', level=logging.INFO, format='%(asctime)s - %(message)s')
  13.     # 创建一个新的窗口
  14.     logWindow = Toplevel(root)
  15.     logWindow.title('日志')
  16.     # 创建一个文本框,用于显示日志内容
  17.     logText = Text(logWindow)
  18.     logText.pack()
  19.     # 读取日志文件内容,并将其显示在文本框中
  20.     with open('日志文件.txt', 'r') as file:
  21.         logContent = file.read()
  22.         logText.insert(END, logContent)
复制代码
注意:这个日志文件会自动生成在工程目录下,并且记录你每次的操作过程
9.设置关于我们:
  1. def about():
  2.     showinfo('关于我们',
  3.              '本程序由林渊达工作室研发。\n林渊达工作室是一个致力于Python程序研究和人工智能开发等工作室。\n如遇问题可以联系邮箱:linyuanda@linyuanda.com。\n个人博客:https'
  4.              '://www.cnblogs.com/python120。')
复制代码
 注意:关于我们是我的开发声明,如无必要,最好不要修改,谢谢配合。
以上就是其他模块的功能
10.进入GUI模块:
  1. if __name__ == '__main__':
  2.     main()
复制代码
好啦,这样就大功告成啦。
完整代码如下:
  1. from tkinter import *
  2. from tkinter.messagebox import askokcancel, showinfo
  3. import tkinter.ttk as ttk
  4. import pyodbc
  5. import os
  6. import logging
  7. import pandas as pd
  8. from tkinter.filedialog import askopenfilename# 连接到 SQL ServerConnect to SQL Server
  9. cn = pyodbc.connect('DRIVER={SQL Server};SERVER=(local);DATABASE=学生管理系统;UID=LYD\\lyd;Trusted_Connection=yes')root = Tk()systitle = '学生信息管理系统'  # 系统标题operateFrame = Frame(root)  # 功能窗口operateFrame.pack()def main():
  10.     root.geometry('800x600')  # 设置窗口初始大小
  11.     root.title(systitle)  # 设置系统标题
  12.     # 创建系统菜单
  13.     menubar = Menu(root)  # 创建Menu对象menubar,将作为root窗口中的菜单
  14.     root.config(menu=menubar)  # 将menubar菜单作为root窗口的顶层菜单栏
  15.     # menuStudent将作为menubar菜单的子菜单
  16.     menuStudent = Menu(menubar, tearoff=0)
  17.     menuStudent.add_command(label='添加新学生', font=('宋体', 10), command=addStudent)
  18.     menuStudent.add_command(label='显示全部学生信息', font=('宋体', 10), command=showAllStudent)
  19.     menuStudent.add_command(label='查找/修改/删除学生信息', font=('宋体', 10), command=checkUpdateStudent)
  20.     menuStudent.add_command(label='批量导入学生信息', font=('宋体', 10), command=importStudents)
  21.     # 菜单file添加为menubar的子菜单
  22.     menubar.add_cascade(label='学生管理', font=('宋体', 10), menu=menuStudent)
  23.     menuHelp = Menu(menubar, tearoff=0)  # help将作为menubar菜单的子菜单
  24.     menuHelp.add_command(label='查看日志', font=('宋体', 10), command=viewLog)
  25.     menuHelp.add_command(label='关于我们', font=('宋体', 10), command=about)
  26.     # 菜单help添加为menubar的子菜单
  27.     menubar.add_cascade(label='其他', font=('宋体', 10), menu=menuHelp)
  28.     menubar.add_command(label='退出', font=('宋体', 10), command=root.quit)
  29.     root.mainloop()def addStudent():
  30.     for widget in operateFrame.winfo_children():  # 清空窗口中原有的所有内容
  31.         widget.destroy()
  32.     f1 = Frame(operateFrame)
  33.     f1.pack()
  34.     studentIdVar = StringVar()
  35.     studentNameVar = StringVar()
  36.     idCardVar = StringVar()
  37.     telVar = StringVar()
  38.     lStudentId = Label(f1, text='学号:')
  39.     lStudentName = Label(f1, text='姓名:')
  40.     lIdCard = Label(f1, text='身份证号码:')
  41.     lTel = Label(f1, text='手机号:')
  42.     tStudentId = Entry(f1, textvariable=studentIdVar)
  43.     tStudentName = Entry(f1, textvariable=studentNameVar)
  44.     tIdCard = Entry(f1, textvariable=idCardVar)
  45.     tTel = Entry(f1, textvariable=telVar)
  46.     lStudentId.grid(row=1, column=1)
  47.     lStudentName.grid(row=2, column=1)
  48.     lIdCard.grid(row=3, column=1)
  49.     lTel.grid(row=4, column=1)
  50.     tStudentId.grid(row=1, column=2)
  51.     tStudentName.grid(row=2, column=2)
  52.     tIdCard.grid(row=3, column=2)
  53.     tTel.grid(row=4, column=2)
  54.     f2 = Frame(operateFrame)
  55.     f2.pack(pady=20)
  56.     bReset = Button(f2, text='重置')
  57.     bSave = Button(f2, text='保存')
  58.     bReset.grid(row=1, column=1)
  59.     bSave.grid(row=1, column=2)
  60.     # 记录用户操作
  61.     logging.info('用户执行了添加新学生操作')
  62.     def reset():
  63.         studentIdVar.set('')
  64.         studentNameVar.set('')
  65.         idCardVar.set('')
  66.         telVar.set('')
  67.     bReset.config(command=reset)
  68.     def save():
  69.         try:
  70.             id = studentIdVar.get()
  71.             if not id.isdigit():
  72.                 raise Exception('学号必须为数字!')
  73.             name = studentNameVar.get()
  74.             id_card = idCardVar.get()
  75.             if len(id_card) != 18:
  76.                 raise Exception('身份证号码必须是18位!')
  77.             tel = telVar.get()
  78.             if len(tel) != 11:
  79.                 raise Exception('手机号必须是11位!')
  80.             # 向数据库发送插入指令
  81.             cursor = cn.cursor()
  82.             cursor.execute('INSERT INTO 学生信息表 VALUES (?, ?, ?, ?)', (id, name, id_card, tel))
  83.             cn.commit()
  84.             showinfo('提示', '保存成功!')
  85.         except Exception as e:
  86.             showinfo('错误', str(e))
  87.     bSave.config(command=save)def showAllStudent():
  88.     # 清空窗口中原有的所有内容
  89.     for widget in operateFrame.winfo_children():
  90.         widget.destroy()
  91.     # 创建表格
  92.     tree = ttk.Treeview(operateFrame)
  93.     tree["columns"] = ("学号", "姓名", "身份证号码", "手机号")
  94.     tree.column("学号", width=100)
  95.     tree.column("姓名", width=100)
  96.     tree.column("身份证号码", width=150)
  97.     tree.column("手机号", width=100)
  98.     tree.heading("学号", text="学号")
  99.     tree.heading("姓名", text="姓名")
  100.     tree.heading("身份证号码", text="身份证号码")
  101.     tree.heading("手机号", text="手机号")
  102.     tree.pack(side=LEFT, fill=Y)
  103.     # 从数据库中获取学生信息
  104.     cursor = cn.cursor()
  105.     cursor.execute("SELECT * FROM 学生信息表")
  106.     rows = cursor.fetchall()
  107.     # 在表格中显示学生信息
  108.     for row in rows:
  109.         tree.insert("", "end", values=row)
  110.     # 记录用户操作
  111.     logging.info('用户执行了显示全部学生信息操作')def checkUpdateStudent():
  112.     for widget in operateFrame.winfo_children():
  113.         widget.destroy()
  114.     f1 = Frame(operateFrame)
  115.     f1.pack()
  116.     searchVar = StringVar()
  117.     searchLabel = Label(f1, text='请输入学号:')
  118.     searchEntry = Entry(f1, textvariable=searchVar)
  119.     searchButton = Button(f1, text='搜索', command=lambda: searchStudent(searchVar.get()))
  120.     searchLabel.grid(row=1, column=1)
  121.     searchEntry.grid(row=1, column=2)
  122.     searchButton.grid(row=1, column=3)
  123.     def searchStudent(studentId):
  124.         # 在数据库中搜索学生信息
  125.         cursor = cn.cursor()
  126.         cursor.execute("SELECT * FROM 学生信息表 WHERE 学号=?", (studentId,))
  127.         row = cursor.fetchone()
  128.         # 记录用户操作
  129.         logging.info('用户执行了查找/修改/删除学生信息操作')
  130.         if row:
  131.             showStudentInfo(row)
  132.         else:
  133.             showinfo('提示', '未找到该学生信息!')
  134.     def showStudentInfo(studentInfo):
  135.         # 清空窗口中原有的所有内容
  136.         for i in operateFrame.winfo_children():
  137.             i.destroy()
  138.         f2 = Frame(operateFrame)
  139.         f2.pack()
  140.         studentIdVar = StringVar(value=studentInfo[0])
  141.         studentNameVar = StringVar(value=studentInfo[1])
  142.         idCardVar = StringVar(value=studentInfo[2])
  143.         telVar = StringVar(value=studentInfo[3])
  144.         lStudentId = Label(f2, text='学号:')
  145.         lStudentName = Label(f2, text='姓名:')
  146.         lIdCard = Label(f2, text='身份证号码:')
  147.         lTel = Label(f2, text='手机号:')
  148.         tStudentId = Entry(f2, textvariable=studentIdVar, state='readonly')
  149.         tStudentName = Entry(f2, textvariable=studentNameVar)
  150.         tIdCard = Entry(f2, textvariable=idCardVar)
  151.         tTel = Entry(f2, textvariable=telVar)
  152.         lStudentId.grid(row=1, column=1)
  153.         lStudentName.grid(row=2, column=1)
  154.         lIdCard.grid(row=3, column=1)
  155.         lTel.grid(row=4, column=1)
  156.         tStudentId.grid(row=1, column=2)
  157.         tStudentName.grid(row=2, column=2)
  158.         tIdCard.grid(row=3, column=2)
  159.         tTel.grid(row=4, column=2)
  160.         f3 = Frame(operateFrame)
  161.         f3.pack(pady=20)
  162.         bUpdate = Button(f3, text='更新',
  163.                          command=lambda: updateStudent(studentIdVar.get(), studentNameVar.get(), idCardVar.get(),
  164.                                                        telVar.get()))
  165.         bDelete = Button(f3, text='删除', command=lambda: deleteStudent(studentIdVar.get()))
  166.         bUpdate.grid(row=1, column=1)
  167.         bDelete.grid(row=1, column=2)
  168.     def updateStudent(studentId, studentName, idCard, tel):
  169.         try:
  170.             if not studentId.isdigit():
  171.                 raise Exception('学号必须为数字!')
  172.             if len(idCard) != 18:
  173.                 raise Exception('身份证号码必须是18位!')
  174.             if len(tel) != 11:
  175.                 raise Exception('手机号必须是11位!')
  176.             # 更新数据库中的学生信息
  177.             cursor = cn.cursor()
  178.             cursor.execute('UPDATE 学生信息表 SET 姓名=?, 身份证号码=?, 手机号=? WHERE 学号=?',
  179.                            (studentName, idCard, tel, studentId))
  180.             cn.commit()
  181.             showinfo('提示', '更新成功!')
  182.         except Exception as e:
  183.             showinfo('错误', str(e))
  184.     def deleteStudent(studentId):
  185.         result = askokcancel('确认', '确定要删除该学生信息吗?')
  186.         if result:
  187.             # 删除数据库中的学生信息
  188.             cursor = cn.cursor()
  189.             cursor.execute('DELETE FROM 学生信息表 WHERE 学号=?', (studentId,))
  190.             cn.commit()
  191.             showinfo('提示', '删除成功!')
  192.             searchVar.set('')
  193.     searchEntry.focus_set()def importStudents():
  194.     # 要求用户选择一个 Excel 文件
  195.     file_path = askopenfilename(filetypes=[('Excel Files', '*.xlsx')])
  196.     if file_path:
  197.         try:
  198.             # 将 Excel 文件读入 pandas DataFrame 中
  199.             df = pd.read_excel(file_path)
  200.             # 循环访问 DataFrame 中的每一行
  201.             for _, row in df.iterrows():
  202.                 student_id = str(row['学号'])
  203.                 student_name = str(row['姓名'])
  204.                 id_card = str(row['身份证号码'])
  205.                 tel = str(row['手机号'])
  206.                 # 检查数据库中是否已存在学生
  207.                 cursor = cn.cursor()
  208.                 cursor.execute("SELECT * FROM 学生信息表 WHERE 学号=?", (student_id,))
  209.                 existing_student = cursor.fetchone()
  210.                 if existing_student:
  211.                     # Student 已存在,跳过导入
  212.                     continue
  213.                 # 将学生插入数据库
  214.                 cursor.execute('INSERT INTO 学生信息表 VALUES (?, ?, ?, ?)', (student_id, student_name, id_card, tel))
  215.                 cn.commit()
  216.             showinfo('提示', '批量导入成功!')
  217.         except Exception as e:
  218.             showinfo('错误', str(e))
  219.     else:
  220.         showinfo('提示', '未选择文件!')
  221.     # 记录用户操作
  222.     logging.info('用户执行了批量导入学生信息')def viewLog():
  223.     # 获取当前工程目录
  224.     project_dir = os.getcwd()
  225.     # 设置日志文件路径
  226.     log_file_path = os.path.join(project_dir, '日志文件.txt')
  227.     # 如果日志文件所在目录不存在,则创建该目录
  228.     log_dir = os.path.dirname(log_file_path)
  229.     if not os.path.exists(log_dir):
  230.         os.makedirs(log_dir)
  231.     # 打开日志文件,进行日志记录
  232.     # 设置日志记录器
  233.     logging.basicConfig(filename='日志文件.txt', level=logging.INFO, format='%(asctime)s - %(message)s')
  234.     # 创建一个新的窗口
  235.     logWindow = Toplevel(root)
  236.     logWindow.title('日志')
  237.     # 创建一个文本框,用于显示日志内容
  238.     logText = Text(logWindow)
  239.     logText.pack()
  240.     # 读取日志文件内容,并将其显示在文本框中
  241.     with open('日志文件.txt', 'r') as file:
  242.         logContent = file.read()
  243.         logText.insert(END, logContent)def about():
  244.     showinfo('关于我们',
  245.              '本程序由林渊达工作室研发。\n林渊达工作室是一个致力于Python程序研究和人工智能开发等工作室。\n如遇问题可以联系邮箱:linyuanda@linyuanda.com。\n个人博客:https'
  246.              '://www.cnblogs.com/python120。')if __name__ == '__main__':
  247.     main()
复制代码
运行结果如下:


至于各大功能运行情况可以自行尝试。如果有问题欢迎随时提问!
 

来源:https://www.cnblogs.com/python120/p/17963680
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具