現状のアプリでどの様に問題を感じているのかがわからないので・・・・なのですが、とりあえず思うことを何点か。
1.
現在の時刻情報はdatetime型で得ることができているのに、比較を文字列で行うのはどうなのでしょう。
date型で比較を行ったほうがよいのではないでしょうか。
datetime.now().replace(hour=0).time()
とすることで、現在の時刻情報から分秒以下を取り出すことができます。これを使うのはどうでしょうか。
2.
ikapyさんも書かれておりますが、0:00 ピッタリと比較すると処理が抜ける可能性があります。
単純に前回取得した時間(分秒のみ)より値が小さくなったら実行などでよいのでは無いでしょうか。
Python
1def loop():
2 # 略
3 while is_valid:
4 cur = datetime.now().replace(hour=0).time()
5 # 前回よりも小さい値か?
6 if cur < before:
7 func()
8 before = cur
9 time.sleep(1)
3.
time.sleep(1)
の部分ですが、ここは精度
とCPU負荷
のトレードオフとなります。
ある程度精度が必要な場合はtime.sleep(0.1)
などとしてみても良いかもしれません。
逆に、そこまでの精度が必要ないのであればtime.sleep(5)
などとしても問題なく動作します。
(当然 "0:00"ピッタリと比較するのであれば動作しなくなりますが)
4.
現在のアプリではThreadが無限ループで実装されているので終了時に止まりません。
Python
1def loop():
2 global is_valid
3 is_valid = True
4
5 while is_valid:
6 # 何かしらの処理
のようにフラグで無限ループを抜けることができるようにして、終了処理にて
Python
1def on_closing():
2 global is_valid
3 is_valid = False
4 t.join()
などとすると良いかと思います。
以上まとめるとこんな感じとなります
Python
1from datetime import datetime
2import tkinter as tk
3import threading as th
4import time
5
6def func():
7 print("func")
8
9def loop():
10 global is_valid
11 is_valid = True
12
13 before = datetime.now().replace(hour=0).time()
14 while is_valid:
15 cur = datetime.now().replace(hour=0).time()
16 print(cur)
17 if cur < before:
18 func()
19 before = cur
20 time.sleep(1)
21
22def on_closing():
23 global is_valid
24
25 is_valid = False
26 t.join()
27 win.destroy()
28
29if __name__ == "__main__":
30 win = tk.Tk()
31
32 t = th.Thread(target=loop)
33 t.start()
34
35 win.protocol("WM_DELETE_WINDOW", on_closing)
36 win.mainloop()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。