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

回答編集履歴

5

文章修正

2020/07/13 11:58

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -31,11 +31,13 @@
31
31
  処理をジェネレータを使って表現して、タイマーを使って疑似的に実現することは可能です。
32
32
 
33
33
  構文という意味ならジェネレータでの `yield` で処理の中断・再開は表現出来ますが、
34
- 恐らく意図されてるような使い方は出来ません。停止・再開の仕組み自体は自分で実装する必要があります。
34
+ ~~恐らく意図されてるような使い方は出来ません。停止・再開の仕組み自体は自分で実装する必要があります。~~
35
+ 追記2: 実際にコードを書いてみて、意外とこの方法も使えそうでした。
35
36
 
37
+
36
38
  追記: ジェネレーターを使ったサンプル
37
39
 
38
- メインスレッド上での実行となる為、
40
+ 注意事項: メインスレッド上での実行となる為、
39
41
  この場合、時間の掛かる処理は出来ません。
40
42
  ```python
41
43
  import tkinter as tk

4

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

2020/07/13 11:58

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -36,7 +36,7 @@
36
36
  追記: ジェネレーターを使ったサンプル
37
37
 
38
38
  メインスレッド上での実行となる為、
39
- この場合、処理1・処理2に時間の掛かる処理は出来ません。
39
+ この場合、時間の掛かる処理は出来ません。
40
40
  ```python
41
41
  import tkinter as tk
42
42
  from functools import partial

3

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

2020/07/13 11:52

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -31,4 +31,29 @@
31
31
  処理をジェネレータを使って表現して、タイマーを使って疑似的に実現することは可能です。
32
32
 
33
33
  構文という意味ならジェネレータでの `yield` で処理の中断・再開は表現出来ますが、
34
- 恐らく意図されてるような使い方は出来ません。停止・再開の仕組み自体は自分で実装する必要があります。
34
+ 恐らく意図されてるような使い方は出来ません。停止・再開の仕組み自体は自分で実装する必要があります。
35
+
36
+ 追記: ジェネレーターを使ったサンプル
37
+
38
+ メインスレッド上での実行となる為、
39
+ この場合、処理1・処理2に時間の掛かる処理は出来ません。
40
+ ```python
41
+ import tkinter as tk
42
+ from functools import partial
43
+
44
+ def button_stop_and_start():
45
+ print("処理1")
46
+ yield
47
+ print("処理2")
48
+ yield
49
+ print("処理3")
50
+
51
+
52
+ root = tk.Tk()
53
+ gen = button_stop_and_start()
54
+
55
+ tk.Button(root, text="Start", command=partial(next, gen, None)).pack()
56
+
57
+ root.after_idle(next, gen) # 実行開始 (処理1 ~ yield で止まる)
58
+ root.mainloop()
59
+ ```

2

コードを追記

2020/07/13 11:51

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -4,6 +4,25 @@
4
4
  [以前の回答](https://teratail.com/questions/275004)にも書きましたが、一時停止・再開には スレッドで threading.Event が使えます。
5
5
  [Demo source code](https://repl.it/@MiKLTea/TkThreadResumeDemo)
6
6
 
7
+ ```python
8
+ import tkinter as tk
9
+ from threading import Thread, Event
10
+
11
+ def button_stop_and_start(event):
12
+ print("処理1")
13
+ event.wait()
14
+ print("処理2")
15
+
16
+
17
+ root = tk.Tk()
18
+ event = Event()
19
+ event.clear()
20
+ thread = Thread(target=button_stop_and_start, args=(event,), daemon=True)
21
+ thread.start()
22
+ tk.Button(root, text="Start", command=event.set).pack()
23
+ root.mainloop()
24
+ ```
25
+
7
26
  メインスレッドでは停止するとウィンドウが応答なしになってしまう為、
8
27
  基本的には中断できません。ボタンが押せなくなってしまいます。
9
28
 

1

前回の回答へリンク

2020/07/13 11:17

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  「止めていた処理」はどのように処理を止めているのでしょう?
2
2
 
3
3
  ----
4
- 以前の回答にも書きましたが、一時停止・再開には スレッドで threading.Event が使えます。
4
+ [以前の回答](https://teratail.com/questions/275004)にも書きましたが、一時停止・再開には スレッドで threading.Event が使えます。
5
5
  [Demo source code](https://repl.it/@MiKLTea/TkThreadResumeDemo)
6
6
 
7
7
  メインスレッドでは停止するとウィンドウが応答なしになってしまう為、