質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Python

    7500questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    5913questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

【wxpython zmq】 wxpython中でserverを建てると動作が停止する。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 235
退会済みユーザー

退会済みユーザー

個人用のローカル接続のみで使うメッセージ系のプログラムをwxpythonで操作しようと考えているのですが、serverを建てたり、client接続する際に動作が停止するという問題にぶつかっています。
以下コードです。

import wx
import zmq

#メッセージ交換に使用する関数
def server_bind(port):
    context = zmq.Context()
    server = context.socket(zmq.REP)
    server.bind("tcp://127.0.0.1:" + str(port))
    return server

def client_connect(port):
    context = zmq.Context()
    client = context.socket(zmq.REQ)
    client.connect("tcp://127.0.0.1:" + str(port))
    return client

def server_recv(server, y):
    x = server.recv_pyobj()
    server.send_pyobj(y)
    return x

def client_recv(client, y):
    client.send_pyobj(y)
    return client.recv_pyobj()

def button_event(event, CS_box, port_ctrl):
    port = port_ctrl.GetValue()
    CS_select = CS_box.GetSelection()

    if CS_select == 0:
        #ここで動作が停止する。
        server = server_bind(port)
        print(server_recv(server, "client君こんばんは(´・ω・`)"))
    else:
        #ここで動作が停止する。
        client = client_connect(port)
        print(client_recv(client, "server君こんにちは(´・ω・`)"))

if __name__ == "__main__":
    app = wx.App()

    frame = wx.Frame(None, wx.ID_ANY, "test")
    panel = wx.Panel(frame, wx.ID_ANY)

    CS_box = wx.RadioBox(panel, wx.ID_ANY, pos=(0, 0),
                         choices=["server", "client"])

    port_ctrl = wx.TextCtrl(panel, wx.ID_ANY, size=(40, 21), pos=(0, 50))
    port_ctrl.SetMaxLength(4)
    port_ctrl.SetValue("1234")

    button = wx.Button(panel, wx.ID_ANY, "接続", pos=(0, 85))
    event = lambda event:button_event(event, CS_box, port_ctrl)
    button.Bind(wx.EVT_BUTTON, event)

    frame.Show()
    app.MainLoop()

問題の部分を絞って書いたつもりですが、長かったらすいません。

button_event関数を実行すると#ここで動作が停止する。とコメントに書かれてある部分で、
windowの移動がままならなくなったり、閉じようとした時に動作が停止しましたと表示されます。
wxpythonとzmqが入っていればコピペで動きますのでどういう感じか見てもらえればわかるかと思います。

もう片方が接続すればすぐに動くようになり、メッセージ交換も成功しますが、
中止して閉じたい時や、windowをちょっと動かしたい時などに不便だなあと感じているのですが、どう解決したらいいのか悩んでいます。

解決策の提案、ご教授を頂けたら嬉しいです。

動作停止が解決したコード

#メッセージ交換に使用する関数
def server_bind(port):
    context = zmq.Context()
    server = context.socket(zmq.REP)
    server.bind("tcp://127.0.0.1:" + str(port))
    return server

def client_connect(port):
    context = zmq.Context()
    client = context.socket(zmq.REQ)
    client.connect("tcp://127.0.0.1:" + str(port))
    return client

def server_recv(server, y, text_ctrl):
    recv = server.recv_pyobj()
    send = server.send_pyobj(y)
    text_ctrl.SetValue(recv)

def client_recv(client, y, text_ctrl):
    send = client.send_pyobj(y)
    recv = client.recv_pyobj()
    text_ctrl.SetValue(recv)

def button_event(event, CS_box, port_ctrl, text_ctrl):
    port = port_ctrl.GetValue()
    CS_select = CS_box.GetSelection()

    if CS_select == 0:
        server = server_bind(port)
        s_recv = threading.Thread(target=server_recv,
                                  args=(server,
                                       "client君やあ(´・ω・`)",
                                       text_ctrl))
        s_recv.start()
    else:
        client = client_connect(port)
        c_recv = threading.Thread(target=client_recv,
                                  args=(client,
                                        "server君やあ(´・ω・`)",
                                        text_ctrl))
        c_recv.start()

if __name__ == "__main__":
    app = wx.App()

    frame = wx.Frame(None, wx.ID_ANY, "test")
    panel = wx.Panel(frame, wx.ID_ANY)

    CS_box = wx.RadioBox(panel, wx.ID_ANY, pos=(0, 0),
                         choices=["server", "client"])

    port_ctrl = wx.TextCtrl(panel, wx.ID_ANY, size=(40, 21), pos=(0, 50))
    port_ctrl.SetMaxLength(4)
    port_ctrl.SetValue("1234")

    text_ctrl = wx.TextCtrl(panel, wx.ID_ANY, pos=(0, 120))

    button = wx.Button(panel, wx.ID_ANY, "接続", pos=(0, 85))
    event = lambda event:button_event(event, CS_box, port_ctrl, text_ctrl)
    button.Bind(wx.EVT_BUTTON, event)

    frame.Show()
    app.MainLoop()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

server.recv_pyobj()app.MainLoop()のスレッドをブロックしてしまっているんだと思います。GUIイベントの処理はなるべく短く済まして、受信に関する待ちは別スレッドに逃がしてやるとWindowの無応答は無くなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/21 01:41

    回答ありがとうございます!
    なるほど、一度イベント外で応答待ちをする方法を考えてみます。

    キャンセル

  • 2017/12/23 01:26

    スレッド関連に慣れてなくて、苦戦しましたがひとまず解決しました。
    解決のヒントをくださりありがとうございました。
    また機会があればよろしくお願いします

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7500questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    5913questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。