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

回答編集履歴

2

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

2020/12/25 00:22

投稿

teamikl
teamikl

スコア8817

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

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

2020/12/25 00:22

投稿

teamikl
teamikl

スコア8817

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
+ 速やかにイベントループに処理を戻す必要があります。