回答編集履歴

1

補足追加

2019/12/20 04:41

投稿

magichan
magichan

スコア15898

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``内の処理が滞ることがなくなり、スムーズに描画がされるようになるかと思います。