t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

Pythonリマインダーに「今やる」通知と「そろそろやる」通知をアイコンで区別する仕組みを導入

今回はこちらの2記事の続き。
thom.hateblo.jp
thom.hateblo.jp

Pythonリマインダーを実際に運用し始めてからすこぶる便利に使っているんだけど、そのうちやる案件だけじゃなくて、単純に時間になったら取り組まないといけない案件もコレで管理を始めた。

どんどん増えてくる。。

そのうちやる案件は多少無視しても大丈夫だけど時間が決まっている案件は正確に知らせて欲しい。

ということでアイコンをもう一つ用意した。

そんでファイル名の日付の後ろにエクスクラメーョンマークが入ってた場合は赤いアイコンが使われる仕組み。

こんな感じ。

例では2個と表示されているけどこれは期限到来ファイルの総数で、うち1個でも!付きのものがあるとアイコンが赤になる。

変更後のコードは次のとおり。

import os
import glob
from datetime import datetime as dt
from plyer import notification


base_path = os.path.dirname(os.path.abspath(__file__))
files = glob.glob(os.path.join(base_path,"tasks\*.txt"))
cnt = 0
punctual_cnt = 0
err = 0
for file in files:
    str_task_time = os.path.basename(file)[0:16]
    try:
        task_time = dt.strptime(str_task_time, "%Y_%m_%d_%H_%M")
        if dt.now() > task_time:
            cnt += 1
            if (os.path.basename(file)[16:17]) == "!":
                punctual_cnt += 1
    except:
        err += 1


notify_title = "ERROR"
notify_message = "不明なエラー"

if not os.path.exists(os.path.join(base_path,"tasks")):
    err += 1
    notify_message = "tasksフォルダが存在しません。\n"+base_path+"を確認してください。"
else:
    if err > 0:
        notify_message = "タスクファイル名の日付書式を確認してください。\n"+base_path+r"\tasks"
    else:
        if cnt > 0:
            notify_message = str(cnt)+" 個の期限切れタスクを処理してください。\n"+base_path+r"\tasks"

icon_path = os.path.join(base_path, "notify.ico")
if punctual_cnt > 0:
    icon_path = os.path.join(base_path, "notify!.ico")

if not os.path.exists(icon_path):
    err += 1
    icon_path = None
    notify_message = "アイコンが見つかりません。\n"+base_path

if err == 0:
    notify_title = "Reminder"

if err+cnt > 0:
    notification.notify(
        title=notify_title,
        message=notify_message,
        app_name="Py Notify",
        app_icon=icon_path,
        timeout=10
    )


ついでに1日リスケするスクリプトも書いたのでご紹介。later.pywという名前で保存し、そこにドラッグ&ドロップすると引数扱いになってファイル名の日付が1日後ろ倒しになる。

コードは次のとおり。

import os
import tkinter as tk
from tkinter import messagebox
import datetime
from datetime import datetime as dt
import sys

fp = sys.argv[1]

root = tk.Tk()
root.withdraw()

str_task_time = os.path.basename(fp)[0:16]
task_time = dt.strptime(str_task_time, "%Y_%m_%d_%H_%M")
new_time = (task_time + datetime.timedelta(days=1)).strftime("%Y_%m_%d_%H_%M")

messagebox.showinfo("Postpond", "[Old]\t" + os.path.basename(fp) + "\n\n" + "[New]\t" + new_time + os.path.basename(fp)[16:])
os.rename(fp, new_time + os.path.basename(fp)[16:])


以上

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。