【附源码】ttkbootstrap实现GUI信息管理系统

203 阅读6分钟

【附源码】ttkbootstrap实现GUI信息管理系统

【附源码】ttkbootstrap实现GUI信息管理系统效果预览环境搭建功能实现展示学生信息表格新增学生信息表单修改学生信息表单删除学生信息代码解析完整代码运行和测试结尾

效果预览

运行截图-2-3比4

环境搭建

  • 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库来设计和实现一个功能性的桌面应用程序。