You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()

关键修改说明

  1. 添加第二个日期选择器:新增结束日期的DateEntry控件,支持选择查询的起始和结束时间点
  2. 修改SQL查询语句:将原有的WHERE regisdate=?替换为WHERE regisdate BETWEEN ? AND ?,实现区间数据筛选
  3. 日期格式匹配:确保格式化后的日期字符串和数据库中regisdate字段的存储格式完全一致(如果数据库用YYYY-MM-DD格式,只需把strftime("%m/%d/%Y")改成strftime("%Y-%m-%d")即可)
  4. 界面优化:调整Treeview列宽让日期显示更完整,更新标签内容展示当前选择的日期区间
  5. 资源管理:查询完成后关闭数据库连接,避免资源泄漏

内容的提问来源于stack exchange,提问作者Siciid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:06:22