別スレッドの導入を強くオススメします。
選択肢:
- (GUIイベントループの提供する) タイマーを使う
- マルチスレッド
- 非同期 I/O (asyncio)
GUI のイベントループ内で実行する場合は、 read(in_waiting) でも、
blocking mode である以上、GUIが止まる可能性が残っているので、
timeout, write_timeoutを設定し、non-blocking mode にする必要があります。
稀なケースですが、read(),write()が完了しない障害時にGUI全体がフリーズしてしまいます
メッセージを受信した時に受信処理をする方法はないでしょうか。
pySerial であれば、行バッファリングならLineReader クラスで、
改行コード受信時にメソッド呼び出しできます。(受信待機にはスレッドを利用)
asyncio を使う場合、非同期シリアル通信のライブラリは複数あるようですが、
行単位の読み出し処理には asyncio.StreamReader を併用すると、
line = await stream.readline()
みたいなコードで、
受信完了まで line への代入を待つような記述が可能になります。
但し、GUIプログラムの場合は、
非同期 I/O のイベントループもGUIのイベントループと一緒に動かさないといけないので、
結局は別スレッドを導入することになります。
(同一スレッド内でも可能ですが、tkinter + asyncio の事例が少ない為)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。