Python 实现提醒应用
文章目录
AI摘要
由
Deepseek提供支持
本项目是一个简单的提醒功能应用程序,使用 Python 的 tkinter 库作为图形用户界面(GUI)框架,结合 schedule 库实现定时提醒功能。用户可以设置提醒主题、选择日期和时间,并在指定时间收到提醒。
主要功能
- 用户界面:
- 提供一个直观的界面,用户可以方便地输入和管理提醒。
- 左侧显示提醒列表,右侧用于输入提醒信息。
- 设置提醒:
- 用户可以输入提醒主题,选择日期和时间。
- 应用程序会检查时间是否在当前时间之后,并允许用户保存提醒。
- 删除提醒:
- 用户可以从列表中选择并删除提醒。
- 保存与加载:
- 提醒信息保存在本地 JSON 文件中,程序启动时自动加载。
- 定时提醒:
- 使用
schedule库定期检查提醒时间,弹出提醒通知。
- 使用
以下是程序的完整代码示例:
import tkinter as tk
from tkinter import messagebox, ttk
from tkcalendar import Calendar
import time
import threading
import json
import os
import schedule
1. 导入所需库
tkinter: 用于创建图形用户界面。messagebox: 用于弹出消息框。ttk: 提供更现代化的控件。Calendar: 用于选择日期。time,threading,json,os: 用于时间处理、线程管理、数据存储和文件操作。schedule: 用于定时任务调度。
2. 创建主类
class ReminderApp:
def __init__(self, root):
self.root = root
self.root.title("提醒功能")
self.root.geometry("600x550")
self.root.resizable(False, False) # 固定窗口大小
ReminderApp类构造函数初始化窗口,设置标题和大小,并固定窗口大小。
3. 设置样式
style = ttk.Style()
style.theme_use('clam') # 使用更现代的主题
style.configure("TLabel", font=("Arial", 12))
style.configure("TButton", font=("Arial", 10))
style.configure("TEntry", font=("Arial", 12))
style.configure("TCombobox", font=("Arial", 12))
- 使用
ttk.Style设置控件样式,选择现代主题,并定义字体。
4. 设置存储路径
self.reminders = []
self.reminder_dir = "C:\\remind"
os.makedirs(self.reminder_dir, exist_ok=True)
self.reminder_file = os.path.join(self.reminder_dir, "reminders.json")
- 初始化提醒列表,并定义存储路径和文件名。使用
os.makedirs创建目录(如果不存在)。
5. 创建控件
self.create_widgets()
self.load_reminders() # 从文件加载提醒
threading.Thread(target=self.run_scheduler, daemon=True).start()
- 调用
create_widgets方法创建界面控件。 - 调用
load_reminders从文件加载已保存的提醒。 - 启动一个线程运行调度器,以便定时检查提醒。
6. 创建界面控件
def create_widgets(self):
main_frame = ttk.Frame(self.root)
main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 左侧提醒列表
self.reminder_listbox = tk.Listbox(main_frame, width=30, height=20, font=("Arial", 10))
self.reminder_listbox.pack(side=tk.LEFT, padx=(0, 10), pady=10)
# 右侧设置模块
settings_frame = ttk.Frame(main_frame)
settings_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
# 标签和输入框
self.label1 = ttk.Label(settings_frame, text="提醒主题:")
self.label1.pack(pady=5)
self.topic_entry = ttk.Entry(settings_frame, width=30)
self.topic_entry.pack(pady=5)
self.label2 = ttk.Label(settings_frame, text="选择提醒日期:")
self.label2.pack(pady=5)
self.calendar = Calendar(settings_frame, date_pattern='y-mm-dd')
self.calendar.pack(pady=5)
self.label3 = ttk.Label(settings_frame, text="选择提醒时间:")
self.label3.pack(pady=5)
self.time_frame = ttk.Frame(settings_frame)
self.time_frame.pack(pady=5)
self.hour_var = tk.StringVar(value="12")
self.minute_var = tk.StringVar(value="00")
self.hour_combobox = ttk.Combobox(self.time_frame, textvariable=self.hour_var, width=3)
self.hour_combobox['values'] = [f"{i:02d}" for i in range(24)]
self.hour_combobox.pack(side=tk.LEFT, padx=5)
self.minute_combobox = ttk.Combobox(self.time_frame, textvariable=self.minute_var, width=3)
self.minute_combobox['values'] = [f"{i:02d}" for i in range(60)]
self.minute_combobox.pack(side=tk.LEFT, padx=5)
# 按钮
self.set_button = ttk.Button(settings_frame, text="设置提醒", command=self.set_reminder)
self.set_button.pack(pady=10)
self.delete_button = ttk.Button(settings_frame, text="删除选中提醒", command=self.delete_reminder)
self.delete_button.pack(pady=5)
# 状态标签
self.status_label = ttk.Label(settings_frame, text="", foreground="green", font=("Arial", 10))
self.status_label.pack(pady=5)
- 创建主框架和子框架。
- 左侧为提醒列表,右侧为设置区域。
- 提供输入框、日期选择器和时间选择器。
- 添加设置和删除按钮,以及状态标签。
7. 调度器
def run_scheduler(self):
while True:
schedule.run_pending()
time.sleep(1)
- 在一个独立线程中运行调度器,定期检查是否有到期的提醒。
8. 加载和保存提醒
def load_reminders(self):
if os.path.exists(self.reminder_file):
with open(self.reminder_file, "r") as file:
self.reminders = json.load(file)
for reminder in self.reminders:
self.reminder_listbox.insert(tk.END, f"{reminder['topic']} - {reminder['date']} {reminder['hour']:02d}:{reminder['minute']:02d}")
def save_reminders(self):
with open(self.reminder_file, "w") as file:
json.dump(self.reminders, file)
load_reminders方法从 JSON 文件加载提醒,并填充到列表中。save_reminders方法将当前提醒保存到文件中。
9. 设置提醒
def set_reminder(self):
topic = self.topic_entry.get()
remind_date = self.calendar.get_date()
remind_hour = int(self.hour_var.get())
remind_minute = int(self.minute_var.get())
if not topic:
messagebox.showwarning("输入错误", "请填写提醒主题")
return
remind_time_str = f"{remind_date} {self.hour_var.get()}:{self.minute_var.get()}"
try:
remind_time = time.strptime(remind_time_str, "%Y-%m-%d %H:%M")
remind_time_seconds = time.mktime(remind_time) - time.time()
if remind_time_seconds < 0:
messagebox.showwarning("时间错误", "提醒时间必须在当前时间之后")
return
reminder = {
"topic": topic,
"date": remind_date,
"hour": remind_hour,
"minute": remind_minute
}
self.reminders.append(reminder)
self.reminder_listbox.insert(tk.END, f"{topic} - {remind_date} {self.hour_var.get()}:{self.minute_var.get()}")
self.status_label.config(text=f"提醒设置成功: {topic} 在 {remind_date} {self.hour_var.get()}:{self.minute_var.get()} 提醒")
self.save_reminders()
schedule.every().day.at(f"{self.hour_var.get()}:{self.minute_var.get()}").do(self.show_reminder, topic)
except Exception as e:
messagebox.showerror("错误", f"设置提醒失败: {e}")
- 收集用户输入的主题、日期和时间。
- 验证输入,确保时间有效。
- 将提醒添加到列表和 JSON 文件中,并设置定时任务。
10. 删除提醒
def delete_reminder(self):
selected_index = self.reminder_listbox.curselection()
if not selected_index:
messagebox.showwarning("选择错误", "请选中要删除的提醒")
return
self.reminders.pop(selected_index[0])
self.reminder_listbox.delete(selected_index)
self.save_reminders()
self.status_label.config(text="提醒已删除")
- 从列表中删除选中的提醒,并更新 JSON 文件。
11. 显示提醒
def show_reminder(self, topic):
messagebox.showinfo("提醒", f"时间到了!主题: {topic}")
- 使用消息框显示提醒。
12. 主程序入口
if __name__ == "__main__":
root = tk.Tk()
app = ReminderApp(root)
root.mainloop()
- 创建主窗口并启动应用程序。
完整代码
import tkinter as tk
from tkinter import messagebox, ttk
from tkcalendar import Calendar
import time
import threading
import json
import os
import schedule
class ReminderApp:
def __init__(self, root):
self.root = root
self.root.title("提醒功能")
self.root.geometry("600x550")
self.root.resizable(False, False) # 固定窗口大小
# 设置样式
style = ttk.Style()
style.theme_use('clam') # 使用更现代的主题
style.configure("TLabel", font=("Arial", 12))
style.configure("TButton", font=("Arial", 10))
style.configure("TEntry", font=("Arial", 12))
style.configure("TCombobox", font=("Arial", 12))
self.reminders = []
# 设置存储路径
self.reminder_dir = "C:\\remind"
os.makedirs(self.reminder_dir, exist_ok=True)
self.reminder_file = os.path.join(self.reminder_dir, "reminders.json")
# 创建控件
self.create_widgets()
self.load_reminders() # 从文件加载提醒
threading.Thread(target=self.run_scheduler, daemon=True).start()
def create_widgets(self):
# 主框架
main_frame = ttk.Frame(self.root)
main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 左侧提醒列表
self.reminder_listbox = tk.Listbox(main_frame, width=30, height=20, font=("Arial", 10))
self.reminder_listbox.pack(side=tk.LEFT, padx=(0, 10), pady=10)
# 右侧设置模块
settings_frame = ttk.Frame(main_frame)
settings_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
# 标签和输入框
self.label1 = ttk.Label(settings_frame, text="提醒主题:")
self.label1.pack(pady=5)
self.topic_entry = ttk.Entry(settings_frame, width=30)
self.topic_entry.pack(pady=5)
self.label2 = ttk.Label(settings_frame, text="选择提醒日期:")
self.label2.pack(pady=5)
self.calendar = Calendar(settings_frame, date_pattern='y-mm-dd')
self.calendar.pack(pady=5)
self.label3 = ttk.Label(settings_frame, text="选择提醒时间:")
self.label3.pack(pady=5)
self.time_frame = ttk.Frame(settings_frame)
self.time_frame.pack(pady=5)
self.hour_var = tk.StringVar(value="12")
self.minute_var = tk.StringVar(value="00")
self.hour_combobox = ttk.Combobox(self.time_frame, textvariable=self.hour_var, width=3)
self.hour_combobox['values'] = [f"{i:02d}" for i in range(24)]
self.hour_combobox.pack(side=tk.LEFT, padx=5)
self.minute_combobox = ttk.Combobox(self.time_frame, textvariable=self.minute_var, width=3)
self.minute_combobox['values'] = [f"{i:02d}" for i in range(60)]
self.minute_combobox.pack(side=tk.LEFT, padx=5)
# 按钮
self.set_button = ttk.Button(settings_frame, text="设置提醒", command=self.set_reminder)
self.set_button.pack(pady=10)
self.delete_button = ttk.Button(settings_frame, text="删除选中提醒", command=self.delete_reminder)
self.delete_button.pack(pady=5)
# 状态标签
self.status_label = ttk.Label(settings_frame, text="", foreground="green", font=("Arial", 10))
self.status_label.pack(pady=5)
def run_scheduler(self):
while True:
schedule.run_pending()
time.sleep(1)
def load_reminders(self):
if os.path.exists(self.reminder_file):
with open(self.reminder_file, "r") as file:
self.reminders = json.load(file)
for reminder in self.reminders:
self.reminder_listbox.insert(tk.END, f"{reminder['topic']} - {reminder['date']} {reminder['hour']:02d}:{reminder['minute']:02d}")
def save_reminders(self):
with open(self.reminder_file, "w") as file:
json.dump(self.reminders, file)
def set_reminder(self):
topic = self.topic_entry.get()
remind_date = self.calendar.get_date()
remind_hour = int(self.hour_var.get())
remind_minute = int(self.minute_var.get())
if not topic:
messagebox.showwarning("输入错误", "请填写提醒主题")
return
remind_time_str = f"{remind_date} {self.hour_var.get()}:{self.minute_var.get()}"
try:
remind_time = time.strptime(remind_time_str, "%Y-%m-%d %H:%M")
remind_time_seconds = time.mktime(remind_time) - time.time()
if remind_time_seconds < 0:
messagebox.showwarning("时间错误", "提醒时间必须在当前时间之后")
return
reminder = {
"topic": topic,
"date": remind_date,
"hour": remind_hour,
"minute": remind_minute
}
self.reminders.append(reminder)
self.reminder_listbox.insert(tk.END, f"{topic} - {remind_date} {self.hour_var.get()}:{self.minute_var.get()}")
self.status_label.config(text=f"提醒设置成功: {topic} 在 {remind_date} {self.hour_var.get()}:{self.minute_var.get()} 提醒")
self.save_reminders()
schedule.every().day.at(f"{self.hour_var.get()}:{self.minute_var.get()}").do(self.show_reminder, topic)
except Exception as e:
messagebox.showerror("错误", f"设置提醒失败: {e}")
def delete_reminder(self):
selected_index = self.reminder_listbox.curselection()
if not selected_index:
messagebox.showwarning("选择错误", "请选中要删除的提醒")
return
self.reminders.pop(selected_index[0])
self.reminder_listbox.delete(selected_index)
self.save_reminders()
self.status_label.config(text="提醒已删除")
def show_reminder(self, topic):
messagebox.showinfo("提醒", f"时间到了!主题: {topic}")
if __name__ == "__main__":
root = tk.Tk()
app = ReminderApp(root)
root.mainloop()
温馨提示 : 非特殊注明,否则均为©李联华的博客网原创文章,本站文章未经授权禁止任何形式转载;来自:俄亥俄州·哥伦布 ,欢迎您的访问!
文章链接:https://www.lilianhua.com/python-implementing-reminder-applications.html
文章链接:https://www.lilianhua.com/python-implementing-reminder-applications.html

