回答編集履歴
1
補足追加
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``内の処理が滞ることがなくなり、スムーズに描画がされるようになるかと思います。
|