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

回答編集履歴

4

説明補足

2020/07/13 12:38

投稿

teamikl
teamikl

スコア8824

answer CHANGED
@@ -11,7 +11,7 @@
11
11
  どちらが適切かかは処理内容・回数次第です。
12
12
 
13
13
  C. は暫定的な対策。デバッグが困難になる為出来れば避けたほうが良い方法ですが、
14
- 応答なしになるのは回避できます。
14
+ 定期的にupdate()を呼び出せれば、応答なしになるのは回避できます。
15
15
 
16
16
  ```python
17
17
  #!/usr/bin/env python3.8

3

解決策に updateを追加

2020/07/13 12:38

投稿

teamikl
teamikl

スコア8824

answer CHANGED
@@ -2,6 +2,7 @@
2
2
   但し、スレッド側からGUIにアクセスする場合は注意。
3
3
   例えば、スレッド側で直接ダイアログを出したり等してはいけません。
4
4
  - B. while の内容を小分けにして タイマー after() で処理する
5
+ - C. while ループの中で root.update()を呼ぶ
5
6
 
6
7
 
7
8
  バックグラウンドで処理は A の方法です。
@@ -9,6 +10,8 @@
9
10
  時間の掛かる処理があると応答なしになるリスクは残ります。
10
11
  どちらが適切かかは処理内容・回数次第です。
11
12
 
13
+ C. は暫定的な対策。デバッグが困難になる為出来れば避けたほうが良い方法ですが、
14
+ 応答なしになるのは回避できます。
12
15
 
13
16
  ```python
14
17
  #!/usr/bin/env python3.8

2

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

2020/07/13 12:37

投稿

teamikl
teamikl

スコア8824

answer CHANGED
@@ -40,12 +40,13 @@
40
40
 
41
41
  thread = Thread(target=countUp, args=(logger,), name="SubThread", daemon=True)
42
42
 
43
+ def start():
44
+ if not thread.ident:
45
+ thread.start()
46
+ countDown(10)
47
+
43
48
  root = tk.Tk()
44
- text = tk.StringVar()
45
- tk.Label(root, textvar=text).pack()
49
+ tk.Button(root, text="Start", command=start).pack()
46
50
  tk.Button(root, text="Quit", command=root.quit).pack()
47
-
48
- root.after_idle(thread.start)
49
- root.after_idle(countDown, 10)
50
51
  root.mainloop()
51
52
  ```

1

サンプルコードを追加

2020/07/13 12:35

投稿

teamikl
teamikl

スコア8824

answer CHANGED
@@ -7,4 +7,45 @@
7
7
  バックグラウンドで処理は A の方法です。
8
8
  B タイマーで処理は、tkinter のイベントループ内で処理する方法です。
9
9
  時間の掛かる処理があると応答なしになるリスクは残ります。
10
- どちらが適切かかは処理内容・回数次第です。
10
+ どちらが適切かかは処理内容・回数次第です。
11
+
12
+
13
+ ```python
14
+ #!/usr/bin/env python3.8
15
+
16
+ import time
17
+ import logging
18
+ from threading import Thread
19
+ from functools import partial
20
+ import tkinter as tk
21
+
22
+ logger = logging.getLogger(__file__)
23
+
24
+ # A
25
+ def countUp(logger, count=0, interval=1): # time.sleep interval sec
26
+ while 1:
27
+ count += 1
28
+ logger.info("Count: {:2}".format(count))
29
+ time.sleep(interval)
30
+
31
+ # B
32
+ def countDown(count, interval=1*1000): # after interval ms
33
+ logger.info("Count: {:2}".format(count))
34
+ root.after(interval, lambda: countDown(count-1, interval))
35
+
36
+
37
+ if __name__ == "__main__":
38
+ logging.basicConfig(level=logging.DEBUG,
39
+ format="[%(levelname)s][%(threadName)-10s] %(message)s")
40
+
41
+ thread = Thread(target=countUp, args=(logger,), name="SubThread", daemon=True)
42
+
43
+ root = tk.Tk()
44
+ text = tk.StringVar()
45
+ tk.Label(root, textvar=text).pack()
46
+ tk.Button(root, text="Quit", command=root.quit).pack()
47
+
48
+ root.after_idle(thread.start)
49
+ root.after_idle(countDown, 10)
50
+ root.mainloop()
51
+ ```