回答編集履歴
2
追記: after のコールバック指定なしについて補足
answer
CHANGED
@@ -17,6 +17,7 @@
|
|
17
17
|
def macro_start():
|
18
18
|
print("A")
|
19
19
|
time.sleep(10) # イベントループから呼び出される場合、このコードは10秒間フリーズする
|
20
|
+
# ※ after(10*1000) の場合も同様
|
20
21
|
print("B")
|
21
22
|
```
|
22
23
|
|
1
質問内容についての回答を追記
answer
CHANGED
@@ -78,4 +78,21 @@
|
|
78
78
|
----
|
79
79
|
スレッドを使う方法 (threading.Event で一時停止)
|
80
80
|
|
81
|
-
- [repl.it -- tkitner/threading.Event を使った pause/resume のデモ](https://repl.it/@MiKLTea/TkThreadResumeDemo#main.py)
|
81
|
+
- [repl.it -- tkitner/threading.Event を使った pause/resume のデモ](https://repl.it/@MiKLTea/TkThreadResumeDemo#main.py)
|
82
|
+
|
83
|
+
※ スレッドを使う場合は、別スレッドから tkinter に直接アクセスしないように注意。
|
84
|
+
スレッドセーフになってないと、再現性の低いバグの原因となることがあります。
|
85
|
+
|
86
|
+
----
|
87
|
+
追記
|
88
|
+
|
89
|
+
> 現在自分が書いているコードだと, macro_start()の全体が読み込まれるまで他のボタンの動作が読み込まれず, stop_flagが更新されません.
|
90
|
+
|
91
|
+
GUIのイベント処理において、
|
92
|
+
ボタンをクリックした時に呼び出される関数は、同時には実行されません。
|
93
|
+
イベントの関数は順番に呼び出されるので、
|
94
|
+
pause_button は macro_start が「完了した後」に呼び出されます。
|
95
|
+
|
96
|
+
フラグ変数のコードを意図した通りに実行されるには、macro_start 部分を別スレッドで実行し、
|
97
|
+
ボタンクリック時に呼び出される関数は、即終了して、
|
98
|
+
速やかにイベントループに処理を戻す必要があります。
|