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

回答編集履歴

1

補足追加

2019/12/20 04:41

投稿

magichan
magichan

スコア15898

answer CHANGED
@@ -43,4 +43,21 @@
43
43
 
44
44
  # ウィンドウを表示する
45
45
  root.mainloop()
46
- ```
46
+ ```
47
+ ---
48
+ **【補足】**
49
+
50
+ 一応簡単に説明を加えます。
51
+
52
+ コードの最後の ``root.mainloop()`` の部分ですが、この関数の内部では、
53
+ - tk内のイベントの捕捉
54
+ - イベントに対応した適切な処理の呼び出し
55
+ - Windowの描画の更新処理
56
+
57
+ などを繰り返す無限ループ(イベントループなどと呼ばれる)のような実装となっております。
58
+
59
+ で、今回問題となっている、``serial_data_recv()``ですが、この関数も当然``mainloop``よりボタンを押されたイベントの処理として呼ばれております。
60
+
61
+ しかしながら、質問のコードのようにコールバック関数内で時間のかかる処理(今回の場合は``sleep()``を含むループ処理)を行ってしまいますと、``mainloop``自体が回らずに処理が滞ってしまいますので、その結果として描画が更新されない状態になってしまいます(今回の不具合の原因)。
62
+
63
+ ですので、コールバック関数内で``sleep()``を含むループ処理を行うのではなく、一旦処理を``mainloop``に戻した上で、``after()``を使って一定時間後に再度イベントコー ルをしてもらうような実装を行うことで、``mainloop``内の処理が滞ることがなくなり、スムーズに描画がされるようになるかと思います。