【附源码】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 = 1
ttk.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库来设计和实现一个功能性的桌面应用程序。