【附源码】ttkbootstrap实现GUI信息管理系统
文章目录
- 【附源码】ttkbootstrap实现GUI信息管理系统
- 效果预览
- 环境搭建
- 功能实现
- 展示学生信息表格
- 新增学生信息表单
- 修改学生信息表单
- 删除学生信息
- 代码解析
- 完整代码
- 运行和测试
- 结尾
效果预览
环境搭建
- Python 3.8 +
- ttkbootstrap 1.10.1
功能实现
展示学生信息表格
使用
ttk.Treeview
组件展示数据。
tv = ttk.Treeview(master=table_frame, columns=columns, show=HEADINGS, bootstyle="primary", height=15)
for column, header, width in zip(columns, headers, width_es):tv.column(column, width=width, anchor="w")tv.heading(column, text=header, anchor="w")
tv.grid(row=0, column=0, sticky="nsew")
这段代码首先创建了一个Treeview
实例,然后设置了列的名称和宽度,并将表格放置在界面上。
新增学生信息表单
创建表单窗口,输入学生信息,并添加到表格。
def open_form_window(action, item=None):# ... 省略窗口创建和控件布局代码 ...def save_data():# 从表单控件中获取数据name = name_entry.get()student_id = student_id_entry.get()age = age_entry.get()class_val = class_entry.get()# 将数据添加到全局数据列表和表格视图中table_data.append((id, name, student_id, age, class_val, create_time))tv.insert('', END, values=(id, name, student_id, age, class_val, create_time))# ... 省略窗口创建和控件布局代码 ...
修改学生信息表单
选择表格中的项,弹出表单窗口进行编辑。
def edit_data():selected_item = tv.selection()if len(selected_item) == 1:item = selected_item[0]values = tv.item(item, "values")open_form_window("修改", values)# ... 省略其他逻辑 ...
这段代码首先获取用户在表格中选择的项,然后使用open_form_window
函数打开一个表单窗口,并传入当前选择项的值。
删除学生信息
选择表格中的项,点击删除按钮进行删除。
def delete_data():selected_item = tv.selection()for item in selected_item:tv.delete(item)
这段代码通过tv.selection()
获取用户选择的项,然后使用tv.delete(item)
删除这些项。
代码解析
- 数据结构:使用列表的列表来存储学生信息,每个内部列表代表一个学生记录。
- 事件处理:通过绑定按钮的
command
属性到相应的函数来处理用户交互,例如点击“保存”按钮时调用save_data
函数。 - 窗口布局:使用
grid
布局管理器来组织窗口中的控件,通过设置sticky
参数来控制控件的扩展行为。
完整代码
import tkinter as tk
import ttkbootstrap as ttk
from ttkbootstrap.constants import *root = ttk.Window(themename="lumen")
root.title("学生信息管理-GUI版本")
root.geometry("1000x900")table_data = [(1, '刘亚索', "001", 15, "软件一班", "2023-07-04"),(2, '王一博', "002", 16, "软件三班", "2023-07-02"),(3, '鸡你美', "003", 14, "大数据八班", "2023-07-08"),(4, '美羊羊', "004", 17, "软件二班", "2023-07-09"),(5, '沸羊羊', "005", 15, "AI五班", "2023-07-06"),(6, 'man羊羊', "006", 15, "火箭三班", "2023-07-06"),(7, '喜羊羊', "006", 15, "火箭三班", "2023-07-06"),(8, 'lan羊羊', "006", 15, "用力五班", "2023-07-06"),(9, '少羊羊', "006", 15, "火箭三班", "2023-07-06"),(10, '托尼', "006", 15, "火箭三班", "2023-07-06"),(11, '黑人大哥', "006", 15, "火箭三班", "2023-07-06"),
] #统计用def open_form_window(action, item=None):"""表单窗口视图与逻辑"""id, name, student_id, age, class_val, create_time = '', '', '', '', '', ''if item is not None:id, name, student_id, age, class_val, create_time = item# print("编辑选中的数据:", item)print(id, name, student_id, age, class_val, create_time)else:print("item is None")form_window = tk.Toplevel(root)form_window.title(action + "学生")form_window.geometry("500x500")# 表单控件ttk.Frame(form_window,height=50).grid(row=0, column=0, sticky='e')start_row = 1ttk.Label(form_window, text="姓名:").grid(row=start_row, column=0, sticky='e')name_var = tk.StringVar()name_entry = ttk.Entry(form_window,textvariable=name_var)name_entry.grid(row=start_row, column=1,padx=20, pady=20, sticky='w')name_var.set(name)ttk.Label(form_window, text="学号:").grid(row=start_row+1, column=0, sticky="e")student_id_var = tk.StringVar()student_id_entry = ttk.Entry(form_window, textvariable=student_id_var)student_id_entry.grid(row=start_row + 1, column=1, padx=20, pady=10,sticky="w")student_id_var.set(student_id)ttk.Label(form_window, text="年龄:").grid(row=start_row+2, column=0, sticky="e")age_var = tk.StringVar()age_entry = ttk.Entry(form_window, textvariable=age_var)age_entry.grid(row=start_row + 2, column=1, padx=20, pady=10, sticky="w")age_var.set(age)ttk.Label(form_window, text="班级:").grid(row=start_row+3, column=0, sticky="e")class_var = tk.StringVar()class_entry = ttk.Entry(form_window, textvariable=class_var)class_entry.grid(row=start_row + 3, column=1, padx=20, pady=10, sticky="w")class_var.set(class_val)def save_data():"""保存数据"""name = name_entry.get()student_id = student_id_entry.get()age = age_entry.get()class_val = class_entry.get()if action == "新增":# todo 在这里实现新增逻辑table_data.append((id, name , student_id ,age,class_val,create_time))tv.insert('', len(table_data)-1, values=(id, name , student_id ,age,class_val,create_time))elif action == "修改":# todo 在这里实现修改逻辑selected_item = tv.selection()if len(selected_item) == 1:item = selected_item[0]# values = tv.item(item, "values")index = tv.index(item)table_data[index] = (name, student_id, age, class_val)tv.item(item, values= (name, student_id, age, class_val))else:print("请选择一项进行编辑")form_window.destroy()button = ttk.Button(form_window,width=20, text="保存", command=save_data)button.grid(column=1, pady=20, sticky="w")# button.grid_columnconfigure(1, weight=1)form_window.grid_columnconfigure(0, weight=1)form_window.grid_columnconfigure(1, weight=1)form_window.mainloop()def delete_data():"""删除选中的数据"""selected_item = tv.selection()for item in selected_item:tv.delete(item)def edit_data():"""编辑选中的数据"""selected_item = tv.selection()if len(selected_item) == 1:item = selected_item[0]values = tv.item(item, "values")open_form_window("修改", values)else:print("请选择一项进行编辑")def init_data():"""初始化表格数据"""for row in table_data:tv.insert('', END, values=row)#==========操作模块=====================
operate_frame = ttk.Frame(root ,width=500,height=300)
operate_frame.grid(row=0, column=0,padx=10,pady=20)ttk.Label(operate_frame, text="姓名:").grid(row=0, column=0, sticky="w")
ttk.Entry(operate_frame).grid(row=0, sticky="w", column=1, columnspan=2,padx=20)
ttk.Button(operate_frame,text="查询").grid(row=0, column=3,padx=20)
ttk.Button(operate_frame,text="新增",bootstyle="success", command=lambda: open_form_window("新增")).grid(row=0, column=4,padx=20)
ttk.Button(operate_frame,text="删除",bootstyle="danger",command=delete_data).grid(row=0, column=5,padx=20)
ttk.Button(operate_frame,text="修改",bootstyle="info",command=edit_data).grid(row=0, column=6)# 1,frame布局包裹
# 2,实例化控件,设置表头样式和标题文本
table_frame = tk.Frame(root, bg="gray", bd=5)
table_frame.grid(row=1, column=0)
columns = (0, 1, 2, 3, 4, 5)
headers = ("ID", "姓名", "学号", "年龄","班级","创建时间")
width_es = ( 60, 200, 80, 80 , 200 , 200 )
tv = ttk.Treeview(master=table_frame,columns=columns,show=HEADINGS,bootstyle="primary",height=15
)
for (column, header, width) in zip(columns, headers, width_es):tv.column(column, width=width, anchor="w")tv.heading(column, text=header, anchor="w")
tv.grid(row=0, column=0, sticky="nsew")# 设置窗口的布局
root.grid_columnconfigure(0, weight=1)init_data()
root.mainloop()
运行和测试
- 说明如何启动程序。
- 进行功能测试,确保每个部分正常工作。
结尾
本教程提供了一个完整的指南,用于创建一个基本的学生信息管理系统GUI。通过本教程,读者将能够理解如何使用Python的Tkinter和ttkbootstrap库来设计和实现一个功能性的桌面应用程序。