こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

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)

これを、受信中でも他のボタンなどが聞くようにするには、
受信部分は別スレッドにすべきなのでしょうか?

いろいろと調べては見たのですが、初歩的すぎるのか、ヒントがえられませんでした。
アドバイス頂きたく、よろしくお願い申し上げます。

投稿日時 - 2015-11-18 08:08:31

QNo.9082080

困ってます

質問者が選んだベストアンサー

GUIの入出力(表示)処理もrecvFromPortでブロックされてしまうので、
受信処理を別スレッドで動かす必要があるかと思います。

参考URLにTkinter+スレッドの参考になりそうなプログラムが載っております。

参考URL:http://bit.ly/1PPfXmL

投稿日時 - 2015-11-19 19:03:43

お礼

ありがとうございます、ご紹介いただいたサイト参考になりました。
おかげさまで、無事完成させ、実働させることが出来ました。

遅くなって恐縮ですが、ありがとうございました。

投稿日時 - 2015-11-29 20:03:12

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-
-広告-
-広告-