※ ChatGPTを利用し、要約された質問です(原文:GUIアプリでブロックする関数使う(スレッド化?))
Python TkinterでUDPメッセージを受信するGUIアプリを作成する際に、recvfrom関数がブロックする問題について
このQ&Aのポイント
Python Tkinterを使用して、UDPメッセージを受信するGUIアプリを作成しています。
受信開始ボタンを押すと、特定のポート番号からUDPでメッセージを受信し、テキストエリアに表示します。
recvfrom関数はメッセージが届くまでブロッキングするため、受信中に他のボタンが反応しない問題があります。
GUIアプリでブロックする関数使う(スレッド化?)
Python, Tkinterで以下のようなGUIアプリを作ろうとしています。
・見た目はWindowsのメモ帳のような感じ
・メニューバーにある「受信開始」ボタンを押すと、特定のポート番号から
UDPで受信したメッセージを取得し、テキストエリアに延々と表示する
(テキストエリアとは、メモ帳で言えば、我々が書きたいテキストを書く部分です)
・普通のGUIアプリ通り、受信・表示中でも、×ボタンを押せば終了するし、
「受信停止」ボタンを押せば受信を停止するようにしたい。
ここで、UDPで受信する際の関数としてrecvfrom関数を使っているのですが、
この関数はメッセージがなにか届くまでブロッキングします。
この間、他の部分、つまり×ボタンだとか、他のボタンは押しても一切無反応になってしまいます。
具体的には、「受信開始」ボタンが押された際に呼ぶ関数として自作のrecvFromPort()という関数を読んでおり、それは以下のようにwhileで延々回すものです。
menubar.add_command(label = "受信開始", under = 0, command = lambda: recvFromPort(port.get()))
def recvFromPort(myport):
[tab] sock = socket(AF_INET, SOCK_DGRAM)
[tab] sock.bind(("", myport))
[tab] while True:
[tab][tab] data, addr = sock.recvfrom(BUFSIZE)
[tab][tab] textarea.insert("end", data)
これを、受信中でも他のボタンなどが聞くようにするには、
受信部分は別スレッドにすべきなのでしょうか?
いろいろと調べては見たのですが、初歩的すぎるのか、ヒントがえられませんでした。
アドバイス頂きたく、よろしくお願い申し上げます。
お礼
ありがとうございます、ご紹介いただいたサイト参考になりました。 おかげさまで、無事完成させ、実働させることが出来ました。 遅くなって恐縮ですが、ありがとうございました。