Python3学生管理系统搜索失效、数据不显示到GUI问题排查
故障修复方案
核心问题点
- 数据库操作(新增/修改/删除)后未刷新界面表格,导致新数据无法主动展示
- 搜索功能仅做了存在性校验,未将匹配到的结果渲染到输入框和表格
- 存在多处语法/逻辑错误:cursor调用
commit()(实际应为连接对象conn.commit())、滚动条配置错误、首次加载未执行查询语句、缺少os模块导入导致退出功能报错
修复代码
1. 补全模块导入
import os # 新增,退出功能依赖该模块 import signal from tkinter import * # 其余原有导入保持不变
2. 修复新增数据函数
def get(): c.execute('CREATE TABLE IF NOT EXISTS database (Sid INTEGER NOT NULL UNIQUE,Fname TEXT,Lname TEXT, Contact INTEGER UNIQUE,City TEXT,State TEXT)') try: c.execute('INSERT INTO database (Sid,Fname,Lname,Contact,City,State) VALUES (?, ?, ?, ?, ?, ?)',(Sid.get(), Fname.get(), Lname.get(), Contact.get(), City.get(), State.get())) conn.commit() # 修复:原代码错误使用c.commit(),cursor无commit方法 clear() open_db() # 新增:操作完成后刷新表格 messagebox.showinfo("提示", "录入成功") except Exception as e: messagebox.showerror("错误", f"录入失败:学号/手机号已存在\n{e}")
3. 修复更新/删除函数(操作后刷新表格)
def update_db(): try: c.execute('UPDATE database SET Fname=?,Lname=?,Contact=?,City=?,State=? WHERE Sid=?',(Fname.get(),Lname.get(),Contact.get(),City.get(),State.get(),Sid.get())) conn.commit() clear() open_db() # 新增:刷新表格 messagebox.showinfo("提示", "更新成功") except Exception as e: messagebox.showerror("错误", f"更新失败\n{e}") def delete_db(): try: c.execute('DELETE FROM database WHERE Sid=?',(Sid.get(),)) conn.commit() clear() open_db() # 新增:刷新表格 messagebox.showinfo("提示", "删除成功") except Exception as e: messagebox.showerror("错误", f"删除失败\n{e}")
4. 重写搜索函数,匹配后渲染结果
def search(): target_sid = Search_val.get() c.execute('SELECT * FROM database WHERE Sid=?', (target_sid,)) res = c.fetchone() if res: messagebox.showinfo("提示","学生已找到") # 填充到上方输入区域 Sid.set(res[0]) Fname.set(res[1]) Lname.set(res[2]) Contact.set(res[3]) City.set(res[4]) State.set(res[5]) # 表格展示匹配结果 tree.delete(*tree.get_children()) tree.insert('', 'end', values=res) return messagebox.showerror("错误","学生未找到")
5. 修复初始化加载逻辑与滚动条配置
找到表格初始化代码段,修改如下:
scroll = ttk.Scrollbar(frame, orient="vertical", command=tree.yview) scroll.pack(side='right', fill='y') tree.configure(yscrollcommand=scroll.set) # 修复:原代码错误配置为xscrollcommand tree.delete(*tree.get_children()) # 以下是原有表头配置代码保持不变 tree.heading(1, text="StudentID") tree.column(1, minwidth=0, width=125, stretch='NO',anchor='center') # 其余表头配置省略,保持不变... tree.heading(6, text="State") tree.column(6, minwidth=0, width=125, stretch='NO', anchor='center') c.execute('SELECT * FROM database') # 新增:首次加载主动查询已有数据 data = c.fetchall() for val in data: tree.insert('', 'end', values=(val[0], val[1], val[2], val[3], val[4], val[5])) conn.commit()
修改完成后所有功能即可正常运行:录入数据后自动刷新表格、搜索到的学生信息会自动填充到输入框且展示在表格中。
内容的提问来源于stack exchange,提问作者Oscar A.
相关产品推荐
相关产品推荐

