回答編集履歴

2

追記: after のコールバック指定なしについて補足

2020/12/25 00:22

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -35,6 +35,8 @@
35
35
  print("A")
36
36
 
37
37
  time.sleep(10) # イベントループから呼び出される場合、このコードは10秒間フリーズする
38
+
39
+ # ※ after(10*1000) の場合も同様
38
40
 
39
41
  print("B")
40
42
 

1

質問内容についての回答を追記

2020/12/25 00:22

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -159,3 +159,37 @@
159
159
 
160
160
 
161
161
  - [repl.it -- tkitner/threading.Event を使った pause/resume のデモ](https://repl.it/@MiKLTea/TkThreadResumeDemo#main.py)
162
+
163
+
164
+
165
+ ※ スレッドを使う場合は、別スレッドから tkinter に直接アクセスしないように注意。
166
+
167
+ スレッドセーフになってないと、再現性の低いバグの原因となることがあります。
168
+
169
+
170
+
171
+ ----
172
+
173
+ 追記
174
+
175
+
176
+
177
+ > 現在自分が書いているコードだと, macro_start()の全体が読み込まれるまで他のボタンの動作が読み込まれず, stop_flagが更新されません.
178
+
179
+
180
+
181
+ GUIのイベント処理において、
182
+
183
+ ボタンをクリックした時に呼び出される関数は、同時には実行されません。
184
+
185
+ イベントの関数は順番に呼び出されるので、
186
+
187
+ pause_button は macro_start が「完了した後」に呼び出されます。
188
+
189
+
190
+
191
+ フラグ変数のコードを意図した通りに実行されるには、macro_start 部分を別スレッドで実行し、
192
+
193
+ ボタンクリック時に呼び出される関数は、即終了して、
194
+
195
+ 速やかにイベントループに処理を戻す必要があります。