1つのアプリケーション(プロセス)で「ジョブ」と「ジョブを制御する処理」がある場合、通常マルチスレッド化します。
Tkinter Window作成----------ジョブのStart/Stopを制御するスレッド------------>
|
-------ジョブを処理するスレッド ----------------------->
2つのスレッドで情報のやり取りを行う仕組みが必要になりますので、例えば共通の変数としてqueue.Queue()のインスタンスを用意し、制御するスレッドからqueue.put("STOP")で停止メッセージを送信し、ジョブを処理スレッド内でqueue.get()をメッセージを受け取り"STOP"を受け取ったら停止する、ということを行います。
複数のプロセス間でこれを行う場合、排他処理として空のファイルを作ることをやります。停止させたい場合にあるディレクトリに空ファイルを置くとプログラムが停止する、というような方式です。
サンプルソース
1秒毎に時刻を表示します。GUIでSTART/STOPが可能です。GUIの作成とスレッド作成を同じJobManagerクラス内に閉じ込めることで、メンバ変数を使ってstart/stopを制御しています。
[追記] teamiklさんの指摘事項(afterでループするとメインスレッドから呼ばれてしまうバグ)を修正しました。
python
1import datetime
2import schedule
3import threading
4import tkinter as tk
5import time
6
7MONITOR_PERIOD = 1
8
9
10def now():
11 return datetime.datetime.now().strftime("%Y年%m月%d日 %H:%M:%S")
12
13
14class JobManager:
15 def __init__(self, root):
16 self.root = root
17 self.running = True
18 self.job_enable = True
19 self.time = tk.StringVar()
20
21 # GUIの準備
22 frame = tk.Frame(root)
23 frame.pack()
24 button_start = tk.Button(frame, text="Start", command=self.start)
25 button_start.pack(side=tk.LEFT)
26 button_stop = tk.Button(frame, text="Stop", command=self.stop)
27 button_stop.pack(side=tk.LEFT)
28 button = tk.Button(frame, text="Quit", fg="red", command=self.quit)
29 button.pack(side=tk.LEFT)
30 label_time = tk.Label(root, textvariable=self.time)
31 label_time.pack()
32
33 # ジョブのスケジューリング
34 schedule.every(MONITOR_PERIOD).seconds.do(self.job)
35
36 # スレッドの開始
37 self.thread = threading.Thread(target=self.run_monitor)
38 self.thread.start()
39
40 def run_monitor(self):
41 while self.running:
42 schedule.run_pending()
43 time.sleep(0.2)
44 self.root.quit()
45
46 def job(self):
47 if self.job_enable:
48 self.time.set(now())
49
50 def start(self):
51 self.job_enable = True
52
53 def stop(self):
54 self.job_enable = False
55 self.time.set("Job is disabled")
56
57 def quit(self):
58 self.running = False
59
60
61def main():
62 root = tk.Tk()
63 JobManager(root)
64 root.mainloop()
65
66
67if __name__ == "__main__":
68 main()
69
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/21 05:20
2020/06/21 07:34
2020/06/21 07:36
2020/06/21 07:36
2020/06/21 07:45
2020/06/21 08:10
2020/06/21 11:55
2020/06/24 00:52
2020/06/24 03:41
2020/06/24 03:50
2020/06/24 09:15
2020/06/25 11:07