回答編集履歴
1
補足追加
test
CHANGED
@@ -89,3 +89,37 @@
|
|
89
89
|
root.mainloop()
|
90
90
|
|
91
91
|
```
|
92
|
+
|
93
|
+
---
|
94
|
+
|
95
|
+
**【補足】**
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
一応簡単に説明を加えます。
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
コードの最後の ``root.mainloop()`` の部分ですが、この関数の内部では、
|
104
|
+
|
105
|
+
- tk内のイベントの捕捉
|
106
|
+
|
107
|
+
- イベントに対応した適切な処理の呼び出し
|
108
|
+
|
109
|
+
- Windowの描画の更新処理
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
などを繰り返す無限ループ(イベントループなどと呼ばれる)のような実装となっております。
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
で、今回問題となっている、``serial_data_recv()``ですが、この関数も当然``mainloop``よりボタンを押されたイベントの処理として呼ばれております。
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
しかしながら、質問のコードのようにコールバック関数内で時間のかかる処理(今回の場合は``sleep()``を含むループ処理)を行ってしまいますと、``mainloop``自体が回らずに処理が滞ってしまいますので、その結果として描画が更新されない状態になってしまいます(今回の不具合の原因)。
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
ですので、コールバック関数内で``sleep()``を含むループ処理を行うのではなく、一旦処理を``mainloop``に戻した上で、``after()``を使って一定時間後に再度イベントコー ルをしてもらうような実装を行うことで、``mainloop``内の処理が滞ることがなくなり、スムーズに描画がされるようになるかと思います。
|