Python 实现提醒应用

Deepseek提供支持

本项目是一个简单的提醒功能应用程序,使用 Python 的 tkinter 库作为图形用户界面(GUI)框架,结合 schedule 库实现定时提醒功能。用户可以设置提醒主题、选择日期和时间,并在指定时间收到提醒。

主要功能

  1. 用户界面
    • 提供一个直观的界面,用户可以方便地输入和管理提醒。
    • 左侧显示提醒列表,右侧用于输入提醒信息。
  2. 设置提醒
    • 用户可以输入提醒主题,选择日期和时间。
    • 应用程序会检查时间是否在当前时间之后,并允许用户保存提醒。
  3. 删除提醒
    • 用户可以从列表中选择并删除提醒。
  4. 保存与加载
    • 提醒信息保存在本地 JSON 文件中,程序启动时自动加载。
  5. 定时提醒
    • 使用 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
请先登录才能参与答题
距本场结束剩 00 00 00 00
轻量应用服务器 2核2G
200M峰值带宽,适用于网站搭建、Web应用、容器环境、电商独立站等
立即前往
扫码进入
扫描二维码购买
文澜千文

文澜千文

请登录以使用此功能。

张君雅小妹妹 甜甜圈 巧克力味 45g*3袋 年货新年礼物 张君雅小妹妹 甜甜圈 巧克力味 45g*3袋 年货新年礼物
Loading...