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

回答編集履歴

1

誤記

2018/09/19 03:44

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  - Endボタンの処理は別スレッドで行う必要なし
16
16
  別スレッドで行うと動かなくなるわけではありませんが、そうすることに意味はありません。
17
- Buttonのコンストラクターのcommand引数に指定するのはあくまで関数であり、それはボタンが押されたときに呼び出されます。またその関数が終了するまではtkinterのイベント処理は動かなくなります。それゆえEndボタンのcommandで直接whileループするような関数を指定するとご質問にあるような問題が起きます。これをスレッドを用いて回避すると
17
+ Buttonのコンストラクターのcommand引数に指定するのはあくまで関数であり、それはボタンが押されたときに呼び出されます。またその関数が終了するまではtkinterのイベント処理は動かなくなります。それゆえ~~End~~Startボタンのcommandで直接whileループするような関数を指定するとご質問にあるような問題が起きます。これをスレッドを用いて回避すると
18
18
  (A) ボタンを押したら別のスレッドを開始し即座に呼び出し元へ戻るようにする
19
19
  (B) whileループは別のスレッドで実行する。
20
20
  となるわけで「tkinterのイベント処理はメインスレッドで継続しつつ、whileループは別のスレッドで並行して動かす=>tkinterのイベント処理がwhileループにより阻害されないようにする」という考え方になります。一方Endボタンの処理は「単にフラグを変更する」だけなので、それを行うのにわざわざスレッドを動かす必要はありません。