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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Python

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

Q&A

解決済

1回答

811閲覧

WebSocketで常に流れてくる値をPyQtでリアルタイムにプロットさせたい

user0001

総合スコア13

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Python

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

0グッド

0クリップ

投稿2023/01/12 10:36

前提

Pythonとwebsocket-clientでbitflyerから価格データをリアルタイム取得するコードを作っています。
それは完成したため、さらに取得した価格データをリアルタイムに描画したいと思いmatplotlibを用いましたが、リアルタイム描画できないこともないのですがウィンドウが重かったため(シンプルに何度もplt.cla(), plt.show(), plt.pause()を繰り返し実行した)、pyqtgraphというライブラリが軽いらしいのでこれを使う方向で考えました。(それの元となっているPyQtというものもあるようなのでこちらでも良いかもしれません)
しかし、websocketでon_messageイベントが呼ばれるたびにpyqtgraphで描画するという方法がわかりません。

https://brainflow.org/2021-07-05-real-time-example/
このページにのっている動画が理想的なものです。
しかしwebsockeと並走させているわけではなさそうです。

よろしくお願いいたします。

実現したいこと

  • websocketのon_messageイベントからリアルタイムに取得される価格データの推移をpyqtgraphでリアルタイム描画する

該当のソースコード

python3

1import websocket 2import json 3 4CHANNEL = "lightning_executions_FX_BTC_JPY" 5 6def on_message(ws, message): 7 global result 8 message = json.loads(message) 9 if message["method"] == "channelMessage": 10 for m in message["params"]["message"]: 11 print(float(m['price'])) 12 13def on_open(ws): 14 ws.send(json.dumps({"method": "subscribe", "params": {"channel": CHANNEL}})) 15 16def on_error(ws, error): 17 print(error) 18 19if __name__ == "__main__": 20 ws = websocket.WebSocketApp("wss://ws.lightstream.bitflyer.com/json-rpc", on_message=on_message, on_open=on_open, on_error=on_error) 21 ws.run_forever()

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/01/12 14:19 編集

matplotlib と組み合わせたコードも記載していただけるとわかりやすいかと思います。
user0001

2023/01/12 14:16

何度も修正したり結局削除したりせずに、もう少し最後まで思考巡らせてからコメントなさってはいかがでしょうか
guest

回答1

0

自己解決

GUIを描画するクラスとwebsocketをlistenするクラスをそれぞれ別に用意し、それぞれ別スレッドで起動してPyQtのconnectとemitを用いてスレッド間通信をすることでウィンドウが重くなることなくリアルタイム描画することができました。

👏とても参考になった記事👏
https://stackoverflow.com/questions/15092076/pyqt-and-websocket-client-listen-websocket-in-background

投稿2023/01/12 14:12

user0001

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問