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

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

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

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

Python

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

マイコン

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

Q&A

解決済

1回答

1664閲覧

PyQt5 センサ情報を複数クラスで使いたいです。

Tatsuya1192

総合スコア9

Windows 10

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

Python

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

マイコン

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

0グッド

1クリップ

投稿2020/04/20 08:02

やりたい事

MENU2クラスでセンサデータをCSV保存したいがPlotCanvasクラスでシリアルポートを使用してしまっている為、このクラスで読むことができません。
今後MENU3でもセンサデータを使いたいので、一度センサデータを配列に入れてその配列を別クラスでも使いまわせる様にしたいです。

やってみたこと

グローバル変数で何とかできないか?→ 当たり前だがセンサデータが更新されず最初に取得したデータがPlotCanvasクラスで延々と流れる。
タイマーで何とかできそう..挫折→ データ取得用GetData クラスを書きインスタンス変数でなんとかできないか?→1行ずつ変えてみるもdata変数が見つからないor正しい書き方ではないと怒られる。→ 現在です...

python

1# -*- coding: utf-8 -*- 2#PyGt5使用 3import sys 4from PyQt5.QtCore import QCoreApplication, pyqtSlot, QTimer 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 12import matplotlib as mpl 13mpl.use("Qt5Agg") 14 15import serial 16import numpy as np 17import csv 18 19############################################################################# 20########### このクラスで得たデータが入った配列を他のクラスでも使いたい ########### 21############################################################################# 22class GetData: 23 def timer(self): 24 timer = QTimer(self) 25 timer.timeout.connect(self.updatedata) 26 timer.start(1) 27 28 def updatedata(self): 29 ser = serial.Serial("COM7") # COMポート 30 #self.ser = serial.Serial("/dev/tty.usbserial-0001") 31 self.data = ser.readline().rstrip() 32 33################################################################################### 34 35class StartMenu(QWidget): #メインウインドウ用のクラス作成 36 def __init__(self, parent): 37 super().__init__(parent) 38 39 self.master = parent 40 self.button1 = QPushButton('Graph', self) #ボタンの作成(表示名) 41 self.button1.move(260, 100) #ボタンの位置を決定(X,Y) 42 self.button1.clicked.connect(self.Graph) #ボタンを押すと(clicked.connect())Graph関数を呼ぶ(Menu2にアクセス) 43 44 self.button2 = QPushButton('InputData', self) 45 self.button2.move(260, 180) 46 self.button2.clicked.connect(self.InputData) 47 48 self.quitbutton1 = QPushButton('exit', self) 49 self.quitbutton1.move (260, 260) 50 self.quitbutton1.clicked.connect(QCoreApplication.instance().quit) 51 52 def initUI(self): 53 self.setWindowTitle(self.title) 54 self.setGeometry(self.width, self.height) 55 self.show() 56 57 def Graph(self): 58 59 self.master.setCurrentIndex(1) #Menu2にアクセス 60 61 def InputData(self): 62 63 self.master.setCurrentIndex(2) 64 65################################################################### 66############# このクラスでセンサデータをCSVで保存したい ############## 67################################################################### 68class Menu2(QWidget): 69 70 def __init__(self, parent): 71 super().__init__(parent) 72 73 # 実際にグラフを打つPlotCanvasクラスのインスタンスを生成。 74 self.m = PlotCanvas(self, width=5, height=4) 75 self.m.move(15,15) 76 77 self.master = parent 78 self.startButton = QPushButton('保存開始', self) 79 self.startButton.move(530, 300) 80 self.startButton.clicked.connect(self.onStartButton) 81 82 self.master = parent 83 self.stopButton = QPushButton('CSVファイル作成', self) 84 self.stopButton.move(530, 330) 85 self.stopButton.clicked.connect(self.onStopButton) 86 87 self.quitbutton2 = QPushButton('quit', self) 88 self.quitbutton2.move(530, 360) 89 self.quitbutton2.clicked.connect(self.quit) 90 91 def onStartButton(self): 92 93 getdata = GetData() 94 getdata.updatedata() 95 self.f = open('example.csv', 'w') 96 self.w = csv.writer(self.f) 97 self.csvdata = [float(self.data)] 98 self.initTime() 99 self.timer.start() 100 101 def onStopButton(self): 102 103 self.timer.stop() 104 try: 105 for i in range(len(self.csvdata)): 106 self.w.writerow(self.csvdata[i]) 107 self.f.close() 108 except: 109 pass 110 111 112 def quit(self): 113 114 self.master.text("return") 115 self.master.setCurrentIndex(0) 116 117####################################################################### 118 119class Menu3(QWidget): 120 121 def __init__(self, parent): 122 super().__init__(parent) 123 self.master = parent 124 125 # テキストボックス作成 126 self.textbox = QLineEdit(self) 127 self.textbox.move(20, 20) 128 self.textbox.resize(200,30) 129 130 # ボタン作成 131 self.button = QPushButton("Show text", self) 132 self.button.move(20,80) 133 self.button.clicked.connect(self.on_click) # ボタン押下時のアクションを指定 134 self.show() 135 136 @pyqtSlot() 137 def on_click(self): 138 textboxValue = self.textbox.text() 139 QMessageBox.question(self, "Message - pythonspot.com", "You typed: " + textboxValue, QMessageBox.Ok, QMessageBox.Ok) 140 self.textbox.setText("") 141 142 self.button4 = QPushButton('登録', self) 143 self.button4.move(530, 100) 144 145 self.button4 = QPushButton('登録', self) 146 self.button4.move(530, 220) 147 148 self.button4 = QPushButton('登録', self) 149 self.button4.move(530, 340) 150 151 self.quitbutton3 = QPushButton('quit', self) 152 self.quitbutton3.move(530, 380) 153 self.quitbutton3.clicked.connect(self.quit) 154 155 def quit(self): 156 self.master.text("return") 157 self.master.setCurrentIndex(0) # StartMenuに移動 158 159 160class App(QTabWidget): 161 def __init__(self): 162 super().__init__() 163 self.setWindowTitle("加速度センシング") 164 # 1個1個のタブがメニューに対応 165 self.tab1 = StartMenu(self) 166 self.tab2 = Menu2(self) 167 self.tab3 = Menu3(self) 168 # タブページに追加 169 self.addTab(self.tab1, "StartMenu") 170 self.addTab(self.tab2, "Graph") 171 self.addTab(self.tab3, "InputData") 172 173 # タブパネルのボーダーを削除 174 self.setStyleSheet("QTabWidget::pane { border: 0; }") 175 # タブバーを非表示に(↓をコメントすると動きがわかりやすくなるかも) 176# self.tabBar().hide() 177 self.resize(640, 470) # サイズの変更と 178 self.move(150, 20) # 立ち上げ位置の設定 179 180 def text(self, text): 181 print(text) 182 183#グラフ描画クラス 184################################################################### 185########### 今まではこのクラスでセンサデータを取得していた ########### 186################################################################### 187class PlotCanvas(FigureCanvas): 188 189 def __init__(self, parent=None, width=5, height=5, dpi=100): 190 self.fig = Figure(figsize=(width, height), dpi=dpi) 191 self.axes = self.fig.add_subplot(111) 192 193 super(PlotCanvas, self).__init__(self.fig) 194 self.setParent(parent) 195 196 FigureCanvas.setSizePolicy( 197 self, 198 QSizePolicy.Expanding, 199 QSizePolicy.Expanding 200 ) 201 FigureCanvas.updateGeometry(self) 202 self.plot() 203 204 def plot(self): 205 206 timer = QTimer(self) 207 timer.timeout.connect(self.updateFigure) 208 self.x = np.arange(0,10) # X方向表示 209 self.xlist_x = np.zeros(10).tolist() # B 210 self.xlist_y = np.zeros(10).tolist() # Y 211 self.xlist_z = np.zeros(10).tolist() # G 212 213 self.axes.set_ylim((-1000,1000)) 214 215 # 初期化的に一度plotしなければならない 216 # そのときplotしたオブジェクトをlistで受け取る受け取る必要がある. 217 self.xlines1, = self.axes.plot(self.x, self.xlist_x) 218 self.xlines2, = self.axes.plot(self.x, self.xlist_y) 219 self.xlines3, = self.axes.plot(self.x, self.xlist_z) 220 221 timer.start(1) 222 223 def updateFigure(self): 224 225 #データ取得用のGetData()クラスのインスタンスを生成 226 getdata = GetData() 227 getdata.updatedata() 228 print(self.data) 229 self.x += 1 # plotデータの更新 230# self.data = self.ser.readline().rstrip() # \nまで読み込む(\nは削除) 今まではここでセンサデータを読んでいた。 231 acc = self.data.decode('utf-8') 232 accs = acc.split(",") 233 acc_x = float(accs[0])/10 + 155 234 acc_y = float(accs[1])/10 235 acc_z = float(accs[2])/10 - 1665 236 237 self.xlist_x.pop(0) 238 self.xlist_x.append(acc_x) 239 self.xlist_y.pop(0) 240 self.xlist_y.append(acc_y) 241 self.xlist_z.pop(0) 242 self.xlist_z.append(acc_z) 243 244 self.xlines1.set_data(self.x, self.xlist_x) 245 self.xlines2.set_data(self.x, self.xlist_y) 246 self.xlines3.set_data(self.x, self.xlist_z) 247 248 self.axes.set_xlim((self.x.min(), self.x.max())) # x軸の範囲適宜修正。 249 250 # plt.pause(interval) 引数はsleep時間 251 self.draw() #plt.pause()がうまく動かなかったのでこっちで。 252 253 def clear(self): 254 self.axes.cla() 255 self.draw() 256 257####################################################################### 258 259def main(): 260 app = QApplication(sys.argv) 261 262 ex1 = App() 263 ex1.show() 264 sys.exit(app.exec_()) 265 266if __name__ == '__main__': 267 main()

追記

開発環境:
Windows10
VScode
Python3
PyQt5
使用モジュールはインストール済

グラフリアルタイム表示までは上手くいっております。
スコープ等がかなり関係していると思いますが勉強不足でまだ理解できていません。。
お力添えお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

センサデータ用のクラスを用意して、各クラスからセンサクラスのインスタンスを呼び出せばいいのでは

投稿2020/04/20 08:33

y_waiwai

総合スコア87719

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

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

Tatsuya1192

2020/04/20 08:51

早速のアドバイスを頂きまして有難う御座います! GetDataクラスはそのつもりで書いたのですが思った様にうごいてくれません。。 もう少し考えてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問