import sqlite3 from datetime import datetime, date import time from tkinter import Tk, messagebox # 初始化数据库 conn = sqlite3.connect('expiry_database.db') cursor = conn.cursor() # 创建数据表 cursor.execute('''CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT NOT NULL, expiry_date TEXT NOT NULL)''') conn.commit() def add_item(name, expiry_date): """添加新项目""" cursor.execute("INSERT INTO items (name, expiry_date) VALUES (?, ?)", (name, expiry_date)) conn.commit() def delete_item(item_id): """删除项目""" cursor.execute("DELETE FROM items WHERE id = ?", (item_id,)) conn.commit() def get_all_items(): """获取所有项目""" cursor.execute("SELECT * FROM items") return cursor.fetchall() def check_expiry(): """检查到期项目并提醒""" today = date.today() items = get_all_items() reminders = [] for item in items: expiry_date = datetime.strptime(item[2], '%Y-%m-%d').date() delta = (expiry_date - today).days if delta == 10: reminders.append(f"❗ {item[1]} 还有10天到期({item[2]})") elif 0 < delta < 10: reminders.append(f"⚠️ {item[1]} 还剩{delta}天到期({item[2]})") elif delta == 0: reminders.append(f"⏰ {item[1]} 今天到期!") elif delta < 0: reminders.append(f"❌ {item[1]} 已过期 {-delta} 天!") if reminders: root = Tk() root.withdraw() messagebox.showwarning( "到期提醒", "\n\n".join(reminders) + "\n\n请及时处理!" ) root.destroy() if __name__ == "__main__": # 初始化 GUI 环境 root = Tk() root.withdraw() # 添加测试数据(示例) # add_item("年度会员订阅", "2024-06-01") # add_item("产品保修到期", "2024-05-15") try: while True: check_expiry() # 每小时检查一次(实际使用时建议设置为 86400 秒) time.sleep(3600) except KeyboardInterrupt: conn.close() print("程序已安全退出")
时间: 2025-03-08 21:05:33 浏览: 117
<think>好的,我现在需要帮用户展示一个使用SQLite和Tkinter实现的物品到期提醒系统的Python代码示例。首先,我得回忆一下Tkinter和SQLite的基本用法。Tkinter是Python的标准GUI库,用来创建界面,而SQLite是轻量级数据库,适合本地存储数据。
用户的需求是物品到期提醒,所以系统应该包含添加物品、设置到期日期,并在临近到期时提醒用户。首先,我需要设计数据库表结构。应该有一个表来存储物品名称、到期日期和是否已提醒的状态。可能需要字段如id(主键)、item_name、expiry_date、notified。
接下来是Tkinter的界面设计。需要输入框让用户输入物品名称和选择日期,还需要一个按钮来添加物品。然后,列表展示已有的物品,可能用Treeview组件来显示表格数据。此外,应该有一个定时检查到期的机制,比如每天检查一次,弹出提醒窗口。
然后考虑功能实现。添加物品时,需要将数据插入SQLite数据库。检查到期日期需要查询数据库,比较当前日期与到期日期,如果剩余天数小于等于设定的阈值(比如3天),则弹出提醒,并更新notified状态避免重复提醒。
需要注意的问题包括日期格式的处理,SQLite的日期函数可能用DATE类型存储,但Python中使用datetime模块来处理比较方便。另外,定时任务可以使用Tkinter的after方法,每隔一定时间(如24小时)执行一次检查。
可能遇到的难点是如何在Tkinter中动态更新界面,比如当添加新物品时,Treeview需要刷新显示。这可以通过每次添加后重新从数据库读取数据并更新Treeview来实现。
还要考虑错误处理,比如用户输入无效的日期格式,或者没有输入物品名称时的提示。可能需要添加try-except块来捕获异常,或者简单的输入验证。
代码结构大概分为几个部分:数据库连接和初始化、GUI界面布局、事件处理函数(添加物品、检查到期)、定时任务设置。需要确保数据库操作使用游标和提交,避免资源泄露。
测试时,需要模拟不同的到期日期,检查提醒是否正常触发,并且notified字段是否正确更新。此外,关闭应用后重新打开时,数据是否持久化,提醒状态是否正确。
现在综合这些思考,开始编写代码示例。首先导入必要的模块,然后创建数据库和表。接着构建Tkinter界面,添加输入组件和按钮。定义添加物品的函数,处理输入并插入数据库,同时刷新Treeview。然后定义检查到期的函数,查询未通知且即将到期的物品,弹出提醒窗口,并更新数据库状态。最后设置定时任务,启动主循环。
需要确保代码中的SQL语句正确,特别是日期比较部分。可能使用SQL的DATE函数和CURRENT_DATE进行比较,计算剩余天数。例如:WHERE expiry_date BETWEEN DATE('now') AND DATE('now', '+3 days') AND notified=0。这样能筛选出未来三天内到期的未提醒物品。
在GUI布局方面,合理排列各个组件,使用grid或pack布局管理器。Treeview的列配置要正确,显示物品名称、到期日期和剩余天数。
最后,测试整个流程,从添加物品到自动提醒,确保功能正常。可能还需要添加一个删除或修改物品的功能,但根据用户需求,示例代码可能先实现基本功能,后续可以扩展。</think>以下是一个基于Python的SQLite+Tkinter物品到期提醒系统实现方案,包含数据库管理、GUI界面和到期检测功能:
```python
import sqlite3
import tkinter as tk
from tkinter import ttk, messagebox
from datetime import datetime, timedelta
class ExpiryReminderSystem:
def __init__(self, master):
self.master = master
self.master.title("物品到期提醒系统")
# 初始化数据库
self.conn = sqlite3.connect('items.db')
self.create_table()
# 界面布局
self.create_widgets()
self.load_items()
self.check_expiry() # 启动时检查
# 每天检查一次(24小时*60分钟*60秒*1000毫秒)
self.master.after(86400000, self.periodic_check)
def create_table(self):
cursor = self.conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS items
(id INTEGER PRIMARY KEY AUTOINCREMENT,
item_name TEXT NOT NULL,
expiry_date DATE NOT NULL,
notified BOOLEAN DEFAULT 0)''')
self.conn.commit()
def create_widgets(self):
# 输入区域
input_frame = ttk.Frame(self.master)
input_frame.pack(padx=10, pady=10, fill=tk.X)
ttk.Label(input_frame, text="物品名称:").grid(row=0, column=0)
self.item_entry = ttk.Entry(input_frame, width=20)
self.item_entry.grid(row=0, column=1, padx=5)
ttk.Label(input_frame, text="到期日期:").grid(row=0, column=2)
self.date_entry = ttk.Entry(input_frame, width=10)
self.date_entry.grid(row=0, column=3, padx=5)
self.date_entry.insert(0, datetime.now().strftime("%Y-%m-%d"))
add_btn = ttk.Button(input_frame, text="添加物品", command=self.add_item)
add_btn.grid(row=0, column=4, padx=5)
# 物品列表
self.tree = ttk.Treeview(self.master, columns=('ID', '物品名称', '到期日期', '剩余天数'), show='headings')
self.tree.heading('ID', text='ID')
self.tree.heading('物品名称', text='物品名称')
self.tree.heading('到期日期', text='到期日期')
self.tree.heading('剩余天数', text='剩余天数')
self.tree.pack(padx=10, pady=10, expand=True, fill=tk.BOTH)
def add_item(self):
item_name = self.item_entry.get()
expiry_date = self.date_entry.get()
if not item_name or not expiry_date:
messagebox.showwarning("输入错误", "请填写完整信息")
return
try:
cursor = self.conn.cursor()
cursor.execute("INSERT INTO items (item_name, expiry_date) VALUES (?, ?)",
(item_name, expiry_date))
self.conn.commit()
self.load_items()
self.item_entry.delete(0, tk.END)
except Exception as e:
messagebox.showerror("数据库错误", str(e))
def load_items(self):
for row in self.tree.get_children():
self.tree.delete(row)
cursor = self.conn.cursor()
cursor.execute("SELECT id, item_name, expiry_date FROM items ORDER BY expiry_date")
for row in cursor.fetchall():
expiry_date = datetime.strptime(row[2], "%Y-%m-%d")
days_left = (expiry_date - datetime.now()).days
self.tree.insert('', tk.END, values=(row[0], row[1], row[2], days_left))
def check_expiry(self):
cursor = self.conn.cursor()
# 查找3天内到期且未提醒的物品
cursor.execute('''SELECT item_name, expiry_date FROM items
WHERE expiry_date BETWEEN DATE('now') AND DATE('now', '+3 days')
AND notified = 0''')
items = cursor.fetchall()
if items:
message = "以下物品即将到期:\n"
for item in items:
message += f"{item[0]} - {item[1]}\n"
messagebox.showwarning("到期提醒", message)
# 更新提醒状态
cursor.execute("UPDATE items SET notified = 1 WHERE notified = 0 AND expiry_date <= DATE('now', '+3 days')")
self.conn.commit()
def periodic_check(self):
self.check_expiry()
self.master.after(86400000, self.periodic_check) # 每天检查一次
if __name__ == "__main__":
root = tk.Tk()
app = ExpiryReminderSystem(root)
root.mainloop()
app.conn.close() # 关闭数据库连接
```
主要功能特点:
1. 使用SQLite进行数据持久化存储[^1]
2. Tkinter实现图形界面
3. 自动每日检查到期物品(提前3天提醒)
4. 支持物品添加和列表展示
5. 防止重复提醒(notified字段标记)
阅读全文
相关推荐


















