teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

終了処理修正

2018/09/19 12:33

投稿

opyon
opyon

スコア1009

answer CHANGED
@@ -3,6 +3,7 @@
3
3
  スレッド終了処理をしていなかったので追記。
4
4
  ([@magichanさん回答コード内参考](https://teratail.com/questions/147319))
5
5
 
6
+ レイアウトは冗長なので割愛。
6
7
  ```Python3
7
8
  # coding=UTF-8
8
9
  import sys
@@ -14,56 +15,104 @@
14
15
  class SSW(tk.Frame):
15
16
 
16
17
  def __init__(self, master = None):
18
+
17
19
  self.th_main = None
20
+ self.update_time = 0.02
21
+
18
- tk.Frame.__init__(self, master)
22
+ super().__init__(master)
19
23
  self.master.title("Sample Stop Watch")
20
- self.master.bind("<Control-q>", self.quit)
21
- self.master.geometry("280x160")
24
+ self.master.geometry("300x200")
22
25
 
26
+ # レイアウト?
27
+ # must be top, bottom, left, or right
28
+ self.f1 = tk.Frame(self)
29
+ self.f1.lbl_total = tk.Label(self, text = "0.00", font = ("", 30))
30
+ self.f1.lbl_total.pack()
23
- self.lbl_msg = tk.Label(master, text = "<quit:Control-q>")
31
+ self.f1.lbl_lap = tk.Label(self, text = "0.00", font = ("", 20))
24
- self.lbl_msg.pack(side = "top")
25
- self.lbl_lap = tk.Label(master, text = "0.00")
26
- self.lbl_lap.pack(side = "top")
32
+ self.f1.lbl_lap.pack()
33
+ self.f1.pack()
27
34
 
35
+ self.f2 = tk.Frame(self)
28
- self.btn_run = tk.Button(master, text = "run", command = self.run)
36
+ self.f2.btn_run = tk.Button(self.f2, text = "run"
37
+ , width = 20, command = self.run)
29
- self.btn_run.pack()
38
+ self.f2.btn_run.pack()
39
+ self.f2.btn_lap = tk.Button(self.f2, text = "lap"
40
+ , width = 20, command = self.lap)
41
+ self.f2.btn_lap.pack()
30
- self.btn_end = tk.Button(master, text = "end", command = self.end)
42
+ self.f2.btn_end = tk.Button(self.f2, text = "end"
43
+ , width = 20, command = self.end)
31
- self.btn_end.pack()
44
+ self.f2.btn_end.pack()
32
- self.btn_quit = tk.Button(master, text = "quit", command = self.quit)
45
+ self.f2.btn_quit = tk.Button(self.f2, text = "quit"
46
+ , width = 20, command = self.quit)
33
- self.btn_quit.pack()
47
+ self.f2.btn_quit.pack()
48
+ self.f2.pack()
34
49
 
50
+ # メインループ
35
51
  def loop(self):
36
52
 
37
53
  timer_start = time.time()
54
+ self.timer_lap_total = 0
55
+
38
56
  self.stop_flg = False
57
+ self.stop_lap = False
39
58
 
40
59
  while not self.stop_flg:
60
+ # 更新時間
41
- time.sleep(0.01)
61
+ time.sleep(self.update_time)
42
- timer_lap = time.time() - timer_start
43
- out_lap = round(timer_lap, 2)
44
- self.lbl_lap.configure(text = out_lap)
45
62
 
63
+ # トータル更新
64
+ timer_total = time.time() - timer_start
65
+ out_total = round(timer_total, 2)
66
+
67
+ self.f1.lbl_total.configure(text = out_total)
68
+
69
+ # ラップ更新
70
+ if not self.stop_lap:
71
+ timer_lap = timer_total - self.timer_lap_total
72
+ out_lap = round(timer_lap, 2)
73
+ self.f1.lbl_lap.configure(text = out_lap)
74
+
75
+ # スレッド開始処理
46
76
  def run(self):
47
77
  print('Start!')
48
- # スレッド開始処理
49
- self.th_main
50
- if not self.th_main:
78
+ if self.th_main == None:
51
- self.th_main = th.Thread(target = self.loop).start()
79
+ self.th_main = th.Thread(target = self.loop)
80
+ self.th_main.start()
52
81
 
82
+ # ラップ計算
83
+ def lap(self):
84
+ if self.stop_lap:
85
+ print('Start Lap!')
86
+ self.timer_lap_tmp = time.time() - self.timer_lap_tmp
87
+ self.timer_lap_total += self.timer_lap_tmp
88
+ self.stop_lap = False
89
+ else:
90
+ print('Stop Lap!')
91
+ self.stop_lap = True
92
+ self.timer_lap_tmp = time.time()
93
+
94
+ # スレッド終了処理
53
95
  def end(self):
54
- self.th_join()
55
96
  print('Stop!')
56
-
57
97
  self.stop_flg = True
58
98
 
59
- # スレッド終了処理
60
- def th_join(self):
61
99
  if self.th_main:
100
+
101
+ print("end 2-1")
62
- self.th_main.join()
102
+ print(self.th_main)
63
103
  self.th_main = None
104
+ print(self.th_main)
64
105
 
106
+ # うまく止まらないので=Noneに変更
107
+ # self.th_main.th_join()
108
+ # self.th_main.stop()
109
+
110
+ print("end 3-1")
111
+
112
+ # フォームを閉じる
65
113
  def quit(self):
114
+ self.stop_flg = True
66
- self.th_join()
115
+ self.th_main = None
67
116
  sys.exit()
68
117
 
69
118
 
@@ -72,6 +121,4 @@
72
121
  ss = SSW()
73
122
  ss.pack()
74
123
  ss.mainloop()
75
- ss.th_main.join()
76
-
77
124
  ```