GUI程序设计--班级信息收集
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
class ClassInfoSystem:
def init(self, root):
self.root = root
self.root.title("班级信息收集系统")
self.root.geometry("800x600")
# 背景色
self.bg_color = "#f0f0f0"
self.root.configure(bg=self.bg_color)
# 创建数据库和表
self.conn = sqlite3.connect('class_info.db')
self.cursor = self.conn.cursor()
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
student_id TEXT NOT NULL UNIQUE,
class_name TEXT NOT NULL,
name TEXT NOT NULL
)
''')
self.conn.commit()
# 创建界面
self.create_widgets()
# 加载初始数据
self.display_students()
def create_widgets(self):
# 主框架
main_frame = tk.Frame(self.root, bg=self.bg_color)
main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
# 标题
tk.Label(main_frame, text="班级信息收集系统",
font=('微软雅黑', 20, 'bold'), bg=self.bg_color).pack(pady=10)
# 注册表单
form_frame = tk.LabelFrame(main_frame, text="学生注册",
font=('微软雅黑', 12), bg=self.bg_color)
form_frame.pack(fill=tk.X, pady=10)
# 学号输入
tk.Label(form_frame, text="学号:", bg=self.bg_color).grid(row=0, column=0, padx=5, pady=5)
self.student_id_entry = tk.Entry(form_frame, width=30)
self.student_id_entry.grid(row=0, column=1, padx=5, pady=5)
# 班级选择
tk.Label(form_frame, text="班级:", bg=self.bg_color).grid(row=1, column=0, padx=5, pady=5)
self.class_entry = ttk.Combobox(form_frame, values=["信计1班", "信计2班"], width=27)
self.class_entry.grid(row=1, column=1, padx=5, pady=5)
# 姓名输入
tk.Label(form_frame, text="姓名:", bg=self.bg_color).grid(row=2, column=0, padx=5, pady=5)
self.name_entry = tk.Entry(form_frame, width=30)
self.name_entry.grid(row=2, column=1, padx=5, pady=5)
# 注册按钮
tk.Button(form_frame, text="注册", command=self.register_student,
width=15).grid(row=3, column=1, pady=10, sticky=tk.E)
# 查询区域
search_frame = tk.LabelFrame(main_frame, text="查询同学",
font=('微软雅黑', 12), bg=self.bg_color)
search_frame.pack(fill=tk.X, pady=10)
tk.Label(search_frame, text="选择班级:", bg=self.bg_color).grid(row=0, column=0, padx=5, pady=5)
self.search_class = ttk.Combobox(search_frame, values=["所有班级", "信计1班", "信计2班"], width=27)
self.search_class.grid(row=0, column=1, padx=5, pady=5)
self.search_class.current(0)
tk.Button(search_frame, text="查询", command=self.search_students,
width=15).grid(row=0, column=2, padx=10)
# 结果显示表格
self.tree = ttk.Treeview(main_frame, columns=('ID', 'Class', 'Name'),
show='headings', height=10)
self.tree.heading('ID', text='学号')
self.tree.heading('Class', text='班级')
self.tree.heading('Name', text='姓名')
self.tree.column('ID', width=200, anchor='center')
self.tree.column('Class', width=150, anchor='center')
self.tree.column('Name', width=150, anchor='center')
self.tree.pack(fill=tk.BOTH, expand=True, pady=10)
# 滚动条
scrollbar = ttk.Scrollbar(self.tree, orient="vertical", command=self.tree.yview)
scrollbar.pack(side="right", fill="y")
self.tree.configure(yscrollcommand=scrollbar.set)
def register_student(self):
student_id = self.student_id_entry.get()
class_name = self.class_entry.get()
name = self.name_entry.get()
if not all([student_id, class_name, name]):
messagebox.showerror("错误", "请填写完整信息!")
return
try:
self.cursor.execute("INSERT INTO students VALUES (NULL, ?, ?, ?)",
(student_id, class_name, name))
self.conn.commit()
messagebox.showinfo("成功", "注册成功!")
self.display_students()
self.clear_form()
except sqlite3.IntegrityError:
messagebox.showerror("错误", "该学号已存在!")
def clear_form(self):
self.student_id_entry.delete(0, tk.END)
self.class_entry.set('')
self.name_entry.delete(0, tk.END)
def search_students(self):
class_name = self.search_class.get()
if class_name == "所有班级":
self.cursor.execute("SELECT student_id, class_name, name FROM students")
else:
self.cursor.execute("SELECT student_id, class_name, name FROM students WHERE class_name=?",
(class_name,))
self.display_students()
def display_students(self):
for item in self.tree.get_children():
self.tree.delete(item)
students = self.cursor.fetchall()
for student in students:
self.tree.insert('', tk.END, values=student)
def __del__(self):
self.conn.close()
if name == "main":
root = tk.Tk()
app = ClassInfoSystem(root)
root.mainloop()