回答編集履歴

5

文章修正

2020/07/13 11:58

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -64,7 +64,11 @@
64
64
 
65
65
  構文という意味ならジェネレータでの `yield` で処理の中断・再開は表現出来ますが、
66
66
 
67
- 恐らく意図されてるような使い方は出来ません。停止・再開の仕組み自体は自分で実装する必要があります。
67
+ ~~恐らく意図されてるような使い方は出来ません。停止・再開の仕組み自体は自分で実装する必要があります。~~
68
+
69
+ 追記2: 実際にコードを書いてみて、意外とこの方法も使えそうでした。
70
+
71
+
68
72
 
69
73
 
70
74
 
@@ -72,7 +76,7 @@
72
76
 
73
77
 
74
78
 
75
- メインスレッド上での実行となる為、
79
+ 注意事項: メインスレッド上での実行となる為、
76
80
 
77
81
  この場合、時間の掛かる処理は出来ません。
78
82
 

4

処理3を追加したため、文章修正

2020/07/13 11:58

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -74,7 +74,7 @@
74
74
 
75
75
  メインスレッド上での実行となる為、
76
76
 
77
- この場合、処理1・処理2に時間の掛かる処理は出来ません。
77
+ この場合、時間の掛かる処理は出来ません。
78
78
 
79
79
  ```python
80
80
 

3

ジェネレーターを使った実装を追記

2020/07/13 11:52

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -65,3 +65,53 @@
65
65
  構文という意味ならジェネレータでの `yield` で処理の中断・再開は表現出来ますが、
66
66
 
67
67
  恐らく意図されてるような使い方は出来ません。停止・再開の仕組み自体は自分で実装する必要があります。
68
+
69
+
70
+
71
+ 追記: ジェネレーターを使ったサンプル
72
+
73
+
74
+
75
+ メインスレッド上での実行となる為、
76
+
77
+ この場合、処理1・処理2に時間の掛かる処理は出来ません。
78
+
79
+ ```python
80
+
81
+ import tkinter as tk
82
+
83
+ from functools import partial
84
+
85
+
86
+
87
+ def button_stop_and_start():
88
+
89
+ print("処理1")
90
+
91
+ yield
92
+
93
+ print("処理2")
94
+
95
+ yield
96
+
97
+ print("処理3")
98
+
99
+
100
+
101
+
102
+
103
+ root = tk.Tk()
104
+
105
+ gen = button_stop_and_start()
106
+
107
+
108
+
109
+ tk.Button(root, text="Start", command=partial(next, gen, None)).pack()
110
+
111
+
112
+
113
+ root.after_idle(next, gen) # 実行開始 (処理1 ~ yield で止まる)
114
+
115
+ root.mainloop()
116
+
117
+ ```

2

コードを追記

2020/07/13 11:51

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -7,6 +7,44 @@
7
7
  [以前の回答](https://teratail.com/questions/275004)にも書きましたが、一時停止・再開には スレッドで threading.Event が使えます。
8
8
 
9
9
  [Demo source code](https://repl.it/@MiKLTea/TkThreadResumeDemo)
10
+
11
+
12
+
13
+ ```python
14
+
15
+ import tkinter as tk
16
+
17
+ from threading import Thread, Event
18
+
19
+
20
+
21
+ def button_stop_and_start(event):
22
+
23
+ print("処理1")
24
+
25
+ event.wait()
26
+
27
+ print("処理2")
28
+
29
+
30
+
31
+
32
+
33
+ root = tk.Tk()
34
+
35
+ event = Event()
36
+
37
+ event.clear()
38
+
39
+ thread = Thread(target=button_stop_and_start, args=(event,), daemon=True)
40
+
41
+ thread.start()
42
+
43
+ tk.Button(root, text="Start", command=event.set).pack()
44
+
45
+ root.mainloop()
46
+
47
+ ```
10
48
 
11
49
 
12
50
 

1

前回の回答へリンク

2020/07/13 11:17

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ----
6
6
 
7
- 以前の回答にも書きましたが、一時停止・再開には スレッドで threading.Event が使えます。
7
+ [以前の回答](https://teratail.com/questions/275004)にも書きましたが、一時停止・再開には スレッドで threading.Event が使えます。
8
8
 
9
9
  [Demo source code](https://repl.it/@MiKLTea/TkThreadResumeDemo)
10
10