GUI
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
--- 数据库操作部分 ---
def init_db():
"""初始化数据库,创建表"""
conn = sqlite3.connect('class_info.db')
c = conn.cursor()
# 创建包含学号、班级、姓名的表
c.execute('''CREATE TABLE IF NOT EXISTS students
(id TEXT PRIMARY KEY, class_name TEXT, name TEXT)''')
conn.commit()
conn.close()
def add_student(student_id, class_name, name):
"""向数据库添加学生"""
try:
conn = sqlite3.connect('class_info.db')
c = conn.cursor()
c.execute("INSERT INTO students VALUES (?, ?, ?)", (student_id, class_name, name))
conn.commit()
conn.close()
return True
except sqlite3.IntegrityError:
return False # 学号重复会报错
def query_classmates(name):
"""根据姓名查询同班同学的学号"""
conn = sqlite3.connect('class_info.db')
c = conn.cursor()
1. 先找到这个名字所在的班级
c.execute("SELECT class_name FROM students WHERE name=?", (name,))
result = c.fetchone()
if not result:
conn.close()
return "未找到该同学", []
my_class = result[0]
2. 查询该班级的所有人,排除自己
c.execute("SELECT id, name FROM students WHERE class_name=? AND name!=?", (my_class, name))
classmates = c.fetchall()
conn.close()
return f"【{name}】所在班级为:{my_class}", classmates
--- 预置一些测试数据(方便你截图) ---
def seed_data():
init_db()
conn = sqlite3.connect('class_info.db')
c = conn.cursor()
# 插入一些假数据,确保有你的名字叫郭琦
test_data = [
('2023001', '计算机2班', '郭琦'),
('2023002', '计算机2班', '张三'),
('2023003', '计算机2班', '李四'),
('2023004', '软件工程1班', '王五')
]
for data in test_data:
try:
c.execute("INSERT OR IGNORE INTO students VALUES (?, ?, ?)", data)
except:
pass
conn.commit()
conn.close()
--- GUI 界面部分 ---
class ClassInfoApp:
def init(self, root):
self.root = root
self.root.title("班级信息收集系统 - 郭琦")
self.root.geometry("500x450")
顶部标题
title_label = tk.Label(root, text="班级信息管理系统", font=("Arial", 16, "bold"))
title_label.pack(pady=10)
--- 注册区域 ---
reg_frame = tk.LabelFrame(root, text="学生注册", padx=10, pady=10)
reg_frame.pack(fill="x", padx=20, pady=5)
tk.Label(reg_frame, text="学号:").grid(row=0, column=0, sticky="e")
self.entry_id = tk.Entry(reg_frame)
self.entry_id.grid(row=0, column=1, padx=5, pady=5)
tk.Label(reg_frame, text="班级:").grid(row=1, column=0, sticky="e")
self.entry_class = tk.Entry(reg_frame)
self.entry_class.grid(row=1, column=1, padx=5, pady=5)
tk.Label(reg_frame, text="姓名:").grid(row=2, column=0, sticky="e")
self.entry_name = tk.Entry(reg_frame)
self.entry_name.grid(row=2, column=1, padx=5, pady=5)
btn_reg = tk.Button(reg_frame, text="注 册", command=self.register_action, bg="#4CAF50", fg="white")
btn_reg.grid(row=3, column=0, columnspan=2, pady=10)
--- 查询区域 ---
query_frame = tk.LabelFrame(root, text="查询同班同学", padx=10, pady=10)
query_frame.pack(fill="x", padx=20, pady=5)
tk.Label(query_frame, text="输入姓名:").pack(side=tk.LEFT)
self.entry_query = tk.Entry(query_frame)
self.entry_query.pack(side=tk.LEFT, padx=5)
btn_query = tk.Button(query_frame, text="查 询", command=self.query_action, bg="#2196F3", fg="white")
btn_query.pack(side=tk.LEFT, padx=5)
--- 结果显示区域 ---
result_frame = tk.Frame(root)
result_frame.pack(fill="both", expand=True, padx=20, pady=5)
tk.Label(result_frame, text="查询结果:", anchor="w").pack(fill="x")
使用 Treeview 显示表格
columns = ("学号", "姓名")
self.tree = ttk.Treeview(result_frame, columns=columns, show="headings")
self.tree.heading("学号", text="学号")
self.tree.heading("姓名", text="姓名")
self.tree.pack(fill="both", expand=True)
状态栏
self.status_var = tk.StringVar(value="就绪")
status_bar = tk.Label(root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)
status_bar.pack(side=tk.BOTTOM, fill=tk.X)
def register_action(self):
sid = self.entry_id.get()
sclass = self.entry_class.get()
sname = self.entry_name.get()
if not sid or not sclass or not sname:
messagebox.showwarning("提示", "请填写完整信息!")
return
success = add_student(sid, sclass, sname)
if success:
messagebox.showinfo("成功", f"学生 {sname} 注册成功!")
self.status_var.set(f"已注册: {sname}")
# 清空输入框
self.entry_id.delete(0, tk.END)
self.entry_class.delete(0, tk.END)
self.entry_name.delete(0, tk.END)
else:
messagebox.showerror("错误", "注册失败,学号可能已存在。")
def query_action(self):
name = self.entry_query.get()
if not name:
messagebox.showwarning("提示", "请输入要查询的姓名")
return
清空旧结果
for item in self.tree.get_children():
self.tree.delete(item)
msg, results = query_classmates(name)
self.status_var.set(msg)
if isinstance(results, list):
if results:
for r in results:
self.tree.insert("", tk.END, values=(r[0], r[1]))
else:
messagebox.showinfo("结果", "该班级没有其他同学(或者是单人班级)。")
else:
messagebox.showinfo("结果", results)
if name == "main":
# 1. 预置数据(包含郭琦的信息)
seed_data()
2. 启动GUI
root = tk.Tk()
app = ClassInfoApp(root)
root.mainloop()
浙公网安备 33010602011771号