回答編集履歴

4

説明補足

2020/07/13 12:38

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  C. は暫定的な対策。デバッグが困難になる為出来れば避けたほうが良い方法ですが、
26
26
 
27
- 応答なしになるのは回避できます。
27
+ 定期的にupdate()を呼び出せれば、応答なしになるのは回避できます。
28
28
 
29
29
 
30
30
 

3

解決策に updateを追加

2020/07/13 12:38

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -5,6 +5,8 @@
5
5
   例えば、スレッド側で直接ダイアログを出したり等してはいけません。
6
6
 
7
7
  - B. while の内容を小分けにして タイマー after() で処理する
8
+
9
+ - C. while ループの中で root.update()を呼ぶ
8
10
 
9
11
 
10
12
 
@@ -19,6 +21,10 @@
19
21
  どちらが適切かかは処理内容・回数次第です。
20
22
 
21
23
 
24
+
25
+ C. は暫定的な対策。デバッグが困難になる為出来れば避けたほうが良い方法ですが、
26
+
27
+ 応答なしになるのは回避できます。
22
28
 
23
29
 
24
30
 

2

サンプルを「ボタンを押したとき」に変更

2020/07/13 12:37

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -82,19 +82,21 @@
82
82
 
83
83
 
84
84
 
85
- root = tk.Tk()
85
+ def start():
86
86
 
87
- text = tk.StringVar()
87
+ if not thread.ident:
88
88
 
89
- tk.Label(root, textvar=text).pack()
89
+ thread.start()
90
90
 
91
- tk.Button(root, text="Quit", command=root.quit).pack()
91
+ countDown(10)
92
92
 
93
93
 
94
94
 
95
- root.after_idle(thread.start)
95
+ root = tk.Tk()
96
96
 
97
- root.after_idle(countDown, 10)
97
+ tk.Button(root, text="Start", command=start).pack()
98
+
99
+ tk.Button(root, text="Quit", command=root.quit).pack()
98
100
 
99
101
  root.mainloop()
100
102
 

1

サンプルコードを追加

2020/07/13 12:35

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -17,3 +17,85 @@
17
17
  時間の掛かる処理があると応答なしになるリスクは残ります。
18
18
 
19
19
  どちらが適切かかは処理内容・回数次第です。
20
+
21
+
22
+
23
+
24
+
25
+ ```python
26
+
27
+ #!/usr/bin/env python3.8
28
+
29
+
30
+
31
+ import time
32
+
33
+ import logging
34
+
35
+ from threading import Thread
36
+
37
+ from functools import partial
38
+
39
+ import tkinter as tk
40
+
41
+
42
+
43
+ logger = logging.getLogger(__file__)
44
+
45
+
46
+
47
+ # A
48
+
49
+ def countUp(logger, count=0, interval=1): # time.sleep interval sec
50
+
51
+ while 1:
52
+
53
+ count += 1
54
+
55
+ logger.info("Count: {:2}".format(count))
56
+
57
+ time.sleep(interval)
58
+
59
+
60
+
61
+ # B
62
+
63
+ def countDown(count, interval=1*1000): # after interval ms
64
+
65
+ logger.info("Count: {:2}".format(count))
66
+
67
+ root.after(interval, lambda: countDown(count-1, interval))
68
+
69
+
70
+
71
+
72
+
73
+ if __name__ == "__main__":
74
+
75
+ logging.basicConfig(level=logging.DEBUG,
76
+
77
+ format="[%(levelname)s][%(threadName)-10s] %(message)s")
78
+
79
+
80
+
81
+ thread = Thread(target=countUp, args=(logger,), name="SubThread", daemon=True)
82
+
83
+
84
+
85
+ root = tk.Tk()
86
+
87
+ text = tk.StringVar()
88
+
89
+ tk.Label(root, textvar=text).pack()
90
+
91
+ tk.Button(root, text="Quit", command=root.quit).pack()
92
+
93
+
94
+
95
+ root.after_idle(thread.start)
96
+
97
+ root.after_idle(countDown, 10)
98
+
99
+ root.mainloop()
100
+
101
+ ```