Python 实现提醒应用
文章目录
由
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
English (US)
Español (ES)
Português (PT)
Français (CA)
Español (MX)
Español (VE)
Español (CO)
Español (AR)
Português (BR)
Quechua (PE)
Guaraní (PY)
简体中文 (ZH)
繁體中文 (HK)
日本語 (JP)
한국어 (KR)
हिन्दी (HI)
Pilipino (PH)
ไทย (TH)
Tiếng Việt (VN)
Bahasa Melayu (MY)
Bahasa Indonesia (ID)
বাংলা (BD)
اردو (PK)
සිංහල (LK)
ភាសាខ្មែរ (KH)
English (UK)
Français (FR)
Deutsch (DE)
Italiano (IT)
Русский (RU)
Nederlands (NL)
Türkçe (TR)
Polski (PL)
Svenska (SE)
Norsk (NO)
Dansk (DK)
Suomi (FI)
Ελληνικά (GR)
Čeština (CZ)
Magyar (HU)
Română (RO)
Български (BG)
Српски (RS)
Українська (UA)

