如何在Python GUI的Treeview中显示Sqlite3库两日期间的学生记录
如何在Python Treeview中显示SQLite3数据库中两个日期之间的学生记录
要实现日期区间的记录查询,你需要添加第二个日期选择控件,并修改SQL查询语句来筛选两个日期之间的数据。以下是修改后的完整代码和关键说明:
修改后的完整代码
import tkinter as tk from tkinter import ttk from tkcalendar import DateEntry import sqlite3 my_w = tk.Tk() my_w.geometry("900x650") # 窗口尺寸 my_w.title("学生注册系统") # 窗口标题 # 定义两个日期变量:起始日期和结束日期 start_sel = tk.StringVar() end_sel = tk.StringVar() # 添加起始日期选择器 start_cal = DateEntry(my_w, selectmode='day', textvariable=start_sel) start_cal.grid(row=0, column=0, padx=20, pady=30) # 添加结束日期选择器 end_cal = DateEntry(my_w, selectmode='day', textvariable=end_sel) end_cal.grid(row=0, column=1, padx=20, pady=30) def my_upd(*args): # 日期变化时触发的更新函数 # 确保两个日期都已选择 if len(start_sel.get()) > 4 and len(end_sel.get()) > 4: # 获取起始日期并格式化为数据库匹配的格式(这里假设数据库存储的是MM/DD/YYYY) start_dt = start_cal.get_date() start_dt_str = start_dt.strftime("%m/%d/%Y") # 获取结束日期并格式化 end_dt = end_cal.get_date() end_dt_str = end_dt.strftime("%m/%d/%Y") # 更新标签显示当前选择的日期区间 date_range = f"{start_dt.strftime('%d-%B-%Y')} 至 {end_dt.strftime('%d-%B-%Y')}" l1.config(text=date_range) # 连接数据库并执行区间查询 con = sqlite3.connect(database="school.db") cur = con.cursor() # 使用BETWEEN关键字查询两个日期之间的记录 cur.execute("SELECT * FROM student WHERE regisdate BETWEEN ? AND ?", (start_dt_str, end_dt_str)) r_set = cur.fetchall() con.close() # 清空Treeview中的旧数据 for item in trv.get_children(): trv.delete(item) # 将查询结果插入Treeview for dt in r_set: trv.insert("", 'end', id=dt[0], text=dt[0], values=(dt[0], dt[1], dt[2], dt[3])) # 日期区间显示标签 l1 = tk.Label(my_w, font=('Times', 22, 'bold'), fg='blue') l1.grid(row=0, column=2) # 初始化Treeview trv = ttk.Treeview(my_w, selectmode='browse') trv.grid(row=1, column=0, columnspan=3, padx=20, pady=20) trv["columns"] = ("0", "1", "2", "3") trv['height'] = 20 trv['show'] = 'headings' # 设置列宽和对齐方式 trv.column("0", width=30, anchor='c') trv.column("1", width=80, anchor='c') trv.column("2", width=80, anchor='c') trv.column("3", width=120, anchor='c') # 加宽日期列以完整显示 # 设置列标题 trv.heading("0", text="ID") trv.heading("1", text="姓名") trv.heading("2", text="联系方式") trv.heading("3", text="注册日期") # 绑定日期变量的变化事件 start_sel.trace('w', my_upd) end_sel.trace('w', my_upd) my_w.mainloop()
关键修改说明
- 添加第二个日期选择器:新增结束日期的
DateEntry控件,支持选择查询的起始和结束时间点 - 修改SQL查询语句:将原有的
WHERE regisdate=?替换为WHERE regisdate BETWEEN ? AND ?,实现区间数据筛选 - 日期格式匹配:确保格式化后的日期字符串和数据库中
regisdate字段的存储格式完全一致(如果数据库用YYYY-MM-DD格式,只需把strftime("%m/%d/%Y")改成strftime("%Y-%m-%d")即可) - 界面优化:调整Treeview列宽让日期显示更完整,更新标签内容展示当前选择的日期区间
- 资源管理:查询完成后关闭数据库连接,避免资源泄漏
内容的提问来源于stack exchange,提问作者Siciid
相关产品推荐
相关产品推荐

