PR

PythonとTkinterを使ったリマインダーツールの作成方法|繰り返し設定とデスクトップ通知

本サイトはアフィリエイト広告を利用しています

リマインダー機能のあるアプリは色々あると思いますが、pythonでリマインダーツールを作ってみます。

機能としてははシンプルにリマインダーの登録や削除が可能で、繰り返し期間(例:毎月第三月曜の指定)も設定できる、さらに情報の一覧表示や削除ができるGUIツールをPythonで作成します。

ここでは、Tkinterライブラリを使用して簡単なデスクトップアプリを作成し、スケジュールの管理にはscheduleライブラリを使用します。

必要なライブラリ

  • schedule: タスクのスケジューリング
  • plyer: デスクトップ通知を表示
  • time: 時間管理
  • tkinter: GUI作成のための標準ライブラリ
  • json: 登録データをファイルに保存
pip install schedule plyer

全体ソース

import tkinter as tk
import schedule
import time
from datetime import datetime
import json
from plyer import notification
from threading import Thread
import calendar
import re
from tkinter import messagebox  # 追加: メッセージボックスでエラーメッセージを表示

# 時刻のフォーマットを検証する関数
def validate_time_format(time_str):
    # 正しいフォーマットは HH:MM または HH:MM:SS で24時間形式
    time_format = re.compile(r'^\d{2}:\d{2}(:\d{2})?$')
    return time_format.match(time_str)

# リマインダーのデータを保存するファイル
REMINDER_FILE = "[ファイルパス]\\reminders.json"

# デスクトップ通知を表示する
def show_notification(title, message):
    notification.notify(
        title=title,
        message=message,
        timeout=10  # 10秒間通知を表示
    )

# リマインダーを実行する関数
def remind(message):
    print(f"Reminder: {message} - {datetime.now()}")
    show_notification("Reminder", message)

# リマインダーをファイルに保存する
def save_reminder_to_file(reminders):
    with open(REMINDER_FILE, "w") as file:
        json.dump(reminders, file)

# リマインダーのリストをファイルから読み込む
def load_reminders_from_file():
    try:
        with open(REMINDER_FILE, "r") as file:
            return json.load(file)
    except FileNotFoundError:
        return []

# 特定の週の曜日をスケジュールする(例: 毎月第3月曜日)
def schedule_monthly_by_weekday(day, week, time_str, message):
    def job_func():
        today = datetime.now()
        month_calendar = calendar.monthcalendar(today.year, today.month)
        # 第X週目の特定の曜日をチェック
        target_date = month_calendar[week-1][day] if month_calendar[week-1][day] != 0 else month_calendar[week][day]
        if today.day == target_date:
            remind(message)
    
    schedule.every().day.at(time_str).do(job_func)

# リマインダーをスケジュールにセットする
def set_reminder(reminder_list):
    schedule.clear()  # スケジュールをクリア
    for reminder in reminder_list:
        time_str = reminder['time']
        message = reminder['message']
        # 'repeat_type', 'day', 'week' のデフォルトを設定
        repeat_type = reminder.get('repeat_type', 'daily')
        day = reminder.get('day', 'monday')
        week = reminder.get('week', 1)

        print(time_str)

        if repeat_type == 'daily':
            schedule.every().day.at(time_str).do(remind, message)
        elif repeat_type == 'weekly':
            getattr(schedule.every(), day).at(time_str).do(remind, message)
        elif repeat_type == 'monthly':
            schedule_monthly_by_weekday(day=day, week=week, time_str=time_str, message=message)


# スケジュールをバックグラウンドで実行する関数
def run_schedule():
    while True:
        schedule.run_pending()
        time.sleep(1)

# リマインダーをGUIで追加する関数
def add_reminder():
    message = entry_message.get()
    time_str = entry_time.get()
    
    # 時刻フォーマットを検証
    if not validate_time_format(time_str):
        messagebox.showerror("入力エラー", "時刻は HH:MM または HH:MM:SS の形式で入力してください")
        return

    repeat_type = repeat_var.get()  # daily, weekly, monthly
    day = day_var.get()
    week = week_var.get()

    reminder_list.append({"message": message, "time": time_str, "repeat_type": repeat_type, "day": day, "week": week})

    save_reminder_to_file(reminder_list)
    update_reminder_listbox()
    set_reminder(reminder_list)

# リマインダーをGUIで削除する関数
def delete_reminder():
    selected_index = listbox.curselection()
    if selected_index:
        reminder_list.pop(selected_index[0])
        save_reminder_to_file(reminder_list)
        update_reminder_listbox()
        set_reminder(reminder_list)

# リマインダーの一覧を更新する
def update_reminder_listbox():
    listbox.delete(0, tk.END)
    for reminder in reminder_list:
        # 'repeat_type' が存在しない場合は 'daily' をデフォルトに設定
        repeat_type = reminder.get('repeat_type', 'daily')
        
        if repeat_type == 'daily':
            repeat_info = "毎日"
        elif repeat_type == 'weekly':
            # 'day' が存在しない場合は 'monday' をデフォルトに設定
            day = reminder.get('day', 'monday')
            repeat_info = f"毎週 {day.capitalize()}"
        elif repeat_type == 'monthly':
            # 'day' が存在しない場合は 'monday' をデフォルトに設定
            # 'week' が存在しない場合は 1 をデフォルトに設定
            day = reminder.get('day', 'monday')
            week = reminder.get('week', 1)
            repeat_info = f"毎月 第{week} {day.capitalize()}"
        
        # リストボックスに表示
        listbox.insert(tk.END, f"{reminder['time']} - {reminder['message']} ({repeat_info})")


# GUIウィンドウのセットアップ
root = tk.Tk()
root.title("リマインダー登録ツール")

# 入力フィールドとボタン
tk.Label(root, text="リマインダー内容:").pack()
entry_message = tk.Entry(root, width=50)
entry_message.pack()

tk.Label(root, text="時刻 (HH:MM形式):").pack()
entry_time = tk.Entry(root, width=50)
entry_time.pack()

# 繰り返し設定
repeat_var = tk.StringVar(value='daily')
tk.Label(root, text="繰り返し設定:").pack()
tk.Radiobutton(root, text="毎日", variable=repeat_var, value='daily').pack(anchor=tk.W)
tk.Radiobutton(root, text="毎週", variable=repeat_var, value='weekly').pack(anchor=tk.W)
tk.Radiobutton(root, text="毎月", variable=repeat_var, value='monthly').pack(anchor=tk.W)

# 曜日選択(毎週・毎月用)
tk.Label(root, text="曜日:").pack()
day_var = tk.StringVar(value='monday')
day_options = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
day_menu = tk.OptionMenu(root, day_var, *day_options)
day_menu.pack()

# 週の選択(毎月用)
tk.Label(root, text="第何週目(毎月の場合):").pack()
week_var = tk.IntVar(value=1)
week_menu = tk.OptionMenu(root, week_var, *[1, 2, 3, 4, 5])
week_menu.pack()

tk.Button(root, text="リマインダーを追加", command=add_reminder).pack()

# リマインダーのリスト表示
listbox = tk.Listbox(root, width=50, height=10)
listbox.pack()

tk.Button(root, text="リマインダーを削除", command=delete_reminder).pack()

# リマインダーリストをファイルから読み込む
reminder_list = load_reminders_from_file()
update_reminder_listbox()

# スケジュールをバックグラウンドで実行
thread = Thread(target=run_schedule, daemon=True)
thread.start()

# GUIループの開始
root.mainloop()

 

機能の詳細

  1. GUIによるリマインダーの追加と削除
    • Tkinterを使ってリマインダーを登録する画面を用意しています。テキスト入力欄からリマインダー内容と時刻(HH:SS形式)を入力し、ボタンを押してリマインダーを追加できます。
    • 登録されたリマインダーは一覧に表示され、リストから選択して削除することも可能です。
  2. 繰り返し期間の設定
    • 繰り返し期間の選択:
      • 毎日(daily)、毎週(weekly)、毎月(monthly)を選択できます。
      • 毎週の場合、曜日を選択し、その曜日にリマインダーが発生します(例: 毎週月曜日)。
      • 毎月の場合、「第X週目のY曜日」といった形式でリマインダーが設定されます(例: 毎月第3月曜日)。
    • 曜日と週の選択:
      • day_varを使って曜日(monday, tuesday…)を指定します。これにより、毎週や毎月のリマインダーに特定の曜日を設定できます。
      • week_varを使って、毎月の第何週目(1~5週目)の設定ができます。
  3. リマインダー一覧の表示
    • 登録されたリマインダーはリストボックスで表示され、内容と時刻および繰り返しの情報も含めたリマインダーの一覧が表示されます。
  4. デスクトップ通知
    • リマインダー時間になると、Pythonのplyerライブラリを使ってデスクトップ通知がポップアップ表示されます。

まとめ

このツールにより、シンプルかつ便利なリマインダー管理ができるようになり、時間の通知や削除も容易に行えます。

既存のリマインダーで満足できない方は、自分専用のリマインダーを作成してみてはどうでしょう!

コメント

タイトルとURLをコピーしました