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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

1回答

1885閲覧

PyQt5とmatplotlibで加速度データX.Y.Zをタブにリアルタイム表示したい

Tatsuya1192

総合スコア9

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

2クリップ

投稿2020/04/14 09:44

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
Python3.7でマイコン+センサからシリアルデータをリアルタイムにグラフ化するシステムを作っています。
このプログラムでは加速度に変換していませんが生のデータの振れ幅を知りたいだけなのであえて行っています。
図のようにタブ2にmatplotlinの動的なグラフを挿入したいのですが以下の問題が発生しました。
イメージ説明

発生している問題・エラーメッセージ

エラーメッセージはないがmatplotlibのグラフのみが表示されてしまいます。

該当のソースコード

python3.7

1# -*- coding: utf-8 -*- 2#PyGt5使用 3import sys 4from PyQt5.QtCore import QCoreApplication, pyqtSlot 5from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QTabWidget, QSizePolicy, QLineEdit, QMessageBox 6from PyQt5.QtGui import QIcon 7 8# グラフ使用 9from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 10from matplotlib.figure import Figure 11import matplotlib.pyplot as plt 12 13#シリアル読み取り 14import serial 15import numpy as np 16 17import random 18 19 20class StartMenu(QWidget): #メインウインドウ用のクラス作成 21 def __init__(self, parent): 22 super().__init__(parent) 23 24 self.master = parent 25 self.button1 = QPushButton('Graph', self) #ボタンの作成(表示名) 26 self.button1.move(260, 100) #ボタンの位置を決定(X,Y) 27 self.button1.clicked.connect(self.Graph) #ボタンを押すと(clicked.connect())Graph関数を呼ぶ(Menu2にアクセス) 28 29 self.button2 = QPushButton('InputData', self) 30 self.button2.move(260, 180) 31 self.button2.clicked.connect(self.InputData) 32 33 self.quitbutton1 = QPushButton('exit', self) 34 self.quitbutton1.move (260, 260) 35 self.quitbutton1.clicked.connect(QCoreApplication.instance().quit) 36 37 def initUI(self): 38 self.setWindowTitle(self.title) 39 self.setGeometry(self.width, self.height) 40 self.show() 41 42 def Graph(self): 43 # 0オリジン 44 self.master.setCurrentIndex(1) #Menu2にアクセス 45 46 def InputData(self): 47 # 0オリジン 48 self.master.setCurrentIndex(2) 49 50class Menu2(QWidget): 51 52 def __init__(self, parent): 53 super().__init__(parent) 54 55 # 実際にグラフを打つPlotCanvasクラスのインスタンスを生成。 56 self.m = PlotCanvas(self, width=5, height=4) 57 self.m.move(15,15) 58 59 self.master = parent 60 self.button3 = QPushButton('保存開始', self) 61 self.button3.move(530, 300) 62# self.button3.clicked.connect(self.saveStart) #未完成 63 64 self.master = parent 65 self.button3 = QPushButton('CSVファイル作成', self) 66 self.button3.move(530, 330) 67# self.button3.clicked.connect(self.saved) #未完成 68 69 self.quitbutton2 = QPushButton('quit', self) 70 self.quitbutton2.move(530, 360) 71 self.quitbutton2.clicked.connect(self.quit) 72 73# def saveStart(self): 74 75 76# def saved(self): 77 78 79 def quit(self): 80 self.master.text("return") 81 self.master.setCurrentIndex(0) 82 83class Menu3(QWidget): 84 85 def __init__(self, parent): 86 super().__init__(parent) 87 self.master = parent 88 89 # テキストボックス作成 90 self.textbox = QLineEdit(self) 91 self.textbox.move(20, 20) 92 self.textbox.resize(200,30) 93 94 # ボタン作成 95 self.button = QPushButton("Show text", self) 96 self.button.move(20,80) 97 self.button.clicked.connect(self.on_click) # ボタン押下時のアクションを指定 98 self.show() 99 100 @pyqtSlot() 101 def on_click(self): 102 textboxValue = self.textbox.text() 103 QMessageBox.question(self, "Message - pythonspot.com", "You typed: " + textboxValue, QMessageBox.Ok, QMessageBox.Ok) 104 self.textbox.setText("") 105 106 self.button4 = QPushButton('登録', self) 107 self.button4.move(530, 100) 108 109 self.button4 = QPushButton('登録', self) 110 self.button4.move(530, 220) 111 112 self.button4 = QPushButton('登録', self) 113 self.button4.move(530, 340) 114 115 self.quitbutton3 = QPushButton('quit', self) 116 self.quitbutton3.move(530, 380) 117 self.quitbutton3.clicked.connect(self.quit) 118 119 def quit(self): 120 self.master.text("return") 121 self.master.setCurrentIndex(0) # StartMenuに移動 122 123 124class App(QTabWidget): 125 def __init__(self): 126 super().__init__() 127 self.setWindowTitle("加速度") 128 # 1個1個のタブがメニューに対応 129 self.tab1 = StartMenu(self) 130 self.tab2 = Menu2(self) 131 self.tab3 = Menu3(self) 132 # タブページに追加 133 self.addTab(self.tab1, "StartMenu") 134 self.addTab(self.tab2, "Graph") 135 self.addTab(self.tab3, "InputData") 136 137 # タブパネルのボーダーを削除 138 self.setStyleSheet("QTabWidget::pane { border: 0; }") 139 # タブバーを非表示に(↓をコメントすると動きがわかりやすくなるかも) 140# self.tabBar().hide() 141 self.resize(640, 470) # サイズの変更と 142 self.move(150, 20) # 立ち上げ位置の設定 143 144 def text(self, text): 145 print(text) 146 147#グラフ描画クラス 148class PlotCanvas(FigureCanvas): 149 150 def __init__(self, parent=None, width=5, height=5, dpi=100): 151 self.fig = Figure(figsize=(width, height), dpi=dpi) 152 self.axes = self.fig.add_subplot(111) 153 154 super(PlotCanvas, self).__init__(self.fig) 155 self.setParent(parent) 156 157 FigureCanvas.setSizePolicy( 158 self, 159 QSizePolicy.Expanding, 160 QSizePolicy.Expanding 161 ) 162 FigureCanvas.updateGeometry(self) 163 self.plot() 164 165 def plot(self): 166 ser = serial.Serial("COM7") # COMポート 167 fig, ax = plt.subplots(1, 1) # Figureオブジェクトとそれに属する一つのAxesオブジェクトを同時に作成 168 x = np.arange(0,10) # XY方向範囲設定 169 list_x = np.zeros(10).tolist() # B 170 list_y = np.zeros(10).tolist() # Y 171 list_z = np.zeros(10).tolist() # G 172 173 ax.set_ylim((-1000,1000)) 174 175 # 初期化的に一度plotしなければならない 176 # そのときplotしたオブジェクトをlistで受け取る受け取る必要がある. 177 lines1, = ax.plot(x, list_x) 178 lines2, = ax.plot(x, list_y) 179 lines3, = ax.plot(x, list_z) 180 181 while True: 182 x += 1 # plotデータの更新 183 data = ser.readline().rstrip() # \nまで読み込む(\nは削除) 184 acc = data.decode('utf-8') 185 acc = acc.split(",") 186 acc_x = float(acc[0])/10 + 155 # 0に合わせる為に +155 187 acc_y = float(acc[1])/10 188 acc_z = float(acc[2])/10 - 1665 # 0に合わせる為に -1665 189 190 list_x.pop(0) 191 list_x.append(acc_x) 192 list_y.pop(0) 193 list_y.append(acc_y) 194 list_z.pop(0) 195 list_z.append(acc_z) 196 197 lines1.set_data(x, list_x) 198 lines2.set_data(x, list_y) 199 lines3.set_data(x, list_z) 200 201 ax.set_xlim((x.min(), x.max())) # 描画範囲適宜修正 202 # set_data()を使うと軸等は自動設定されない 203 plt.pause(1) # plt.pause(interval) 引数=sleep時間 204 205 def clear(self): 206 self.axes.cla() 207 self.draw() 208 209 210def main(): 211 app = QApplication(sys.argv) 212 ex1 = App() 213 ex1.show() 214 sys.exit(app.exec_()) 215 216if __name__ == '__main__': 217 main()

試したこと

lines1.set_data()をタブ2表示箇所に持っていったりしました。。
正直GUIアプリケーションを初めて作るので勉強が足りなすぎると思います。。

補足情報(FW/ツールのバージョンなど)

OS:Windows10
言語:Python3.7.6
エディタ:VisualStadioCode
シリアルポート:COM7
ボーレート:9600
センサ情報はUART通信で問題なく来ております。
例)
-1716,108,16616
-1580,40,16644
-1724,148,16616

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点

  • PlotCanvas.plot の無限ループで実行が滞る

Menu2() -> PlotCanvas() -> plot() と呼び出され
plot 内でずっとループしてる為、Menu3() 等の残りのコードが実行されません。

解決策

タイマー等を用いて、GUI部品が構築された後にプロットを開始するようにします。
メインスレッド以外からは直接描画等の操作は出来ないので、
タイマー内で行うのは入出力とデータの更新のみ。

PyQtGraph という別ライブラリでの記事ですが、
タイマーの扱い辺り参考になると思います。

投稿2020/04/14 11:56

編集2020/04/15 07:15
teamikl

総合スコア8664

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

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

Tatsuya1192

2020/04/14 15:23

早速ご教示頂きまして有難う御座います! 言われてみれば仰る通りでした。。 無限ループの扱いを軽くみてしまっていました。。 明朝お伝え頂いたURLも参考に挑戦してみます!
Tatsuya1192

2020/04/15 10:29

teamiki様 無事問題解決致しました! 誠に有難う御座います! まだまだ課題はありますがteamiki様のレベルに少しでも近づけるようたくさん考えます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問