前提・実現したいこと
GetDataクラスで取得したセンサデータをいくつかの他クラスで使用したいです。
具体的にはGetDataクラス → Menu2クラスでCSV保存用途と、PlotCanvasクラスのupdateFigure()でのリアルタイムグラフ表示です。
1周間近く詰まってしまったので以前助けていただけたこちらのサイトの皆様の助言をいただきたいです。
発生している問題・エラーメッセージ
ValueError: could not convert string to float: 'None'
該当のソースコード
python3
1# 文字数制限の為省略しています。全文載せられます。 2# 以下に動作段階のコードを記載しております。 3# 動作段階のコードにclass GetData()を作成してMenu2クラスとPlotCanvasクラスで使用しようとしておりました。
試したこと
最初はグローバル変数で出来ないか試したが最初に取得したデータのみがタイマーで出続けるのみ。(失敗)
関数を書いてグローバル変数にタイマーで取得し続けた値を入れようとする。(失敗)
スコープ範囲を広げてみる。 理解出来ていなかった為他の方の記述がいじれない。(失敗)
データ取得用クラス作成(GetData)。数値が入っていない様子。(現在)
本当は1行ずつデバッグしながら組んでいくものなのでしょうが、プログラミング初級者であるため1からの記述が難しかったためいろいろな方のコードを引っ張ってきており、私のレベルでは難しい状況となってしまいました。。
補足情報(FW/ツールのバージョンなど)
Windows10 or macOS Catalina 10.15.4
言語 : Python3 (関係ないはずですがファームウェアはCとMicroPythonの2パターンあります。)
フレーム : PyQt5
PlotCanvasクラスのupdateFigure()内でデータ取得をした場合問題なく動きました。
お恥ずかしながら初歩的なことで躓いており、心折れかけてます。
おわかりになる方の助言を心からおまちしております。。
以下追記です。
動いている段階までもどってみました。最近は動かなくてはこのバックアップにもどってのくりかえしです。。
python
1 2class StartMenu(QWidget): #メインウインドウ用のクラス作成 3 def __init__(self, parent): 4 super().__init__(parent) 5 6 self.master = parent 7 self.button1 = QPushButton('Graph', self) #ボタンの作成(表示名) 8 self.button1.move(260, 100) #ボタンの位置を決定(X,Y) 9 self.button1.clicked.connect(self.Graph) #ボタンを押すと(clicked.connect())Graph関数を呼ぶ(Menu2にアクセス) 10 11 self.button2 = QPushButton('InputData', self) 12 self.button2.move(260, 180) 13 self.button2.clicked.connect(self.InputData) 14 15 self.quitbutton1 = QPushButton('exit', self) 16 self.quitbutton1.move (260, 260) 17 self.quitbutton1.clicked.connect(QCoreApplication.instance().quit) 18 19 def initUI(self): 20 self.setWindowTitle(self.title) 21 self.setGeometry(self.width, self.height) 22 self.show() 23 24 def Graph(self): 25 # 0オリジン 26 self.master.setCurrentIndex(1) #Menu2にアクセス 27 28 def InputData(self): 29 # 0オリジン 30 self.master.setCurrentIndex(2) 31 32class Menu2(QWidget): 33 34 def __init__(self, parent): 35 super().__init__(parent) 36 37 # 実際にグラフを打つPlotCanvasクラスのインスタンスを生成。 38 self.m = PlotCanvas(self, width=5, height=4) 39 self.m.move(15,15) 40 41 self.master = parent 42 self.startButton = QPushButton('保存開始', self) 43 self.startButton.move(530, 300) 44# self.startButton.clicked.connect(self.onStartButton) 45 46 self.master = parent 47 self.stopButton = QPushButton('CSVファイル作成', self) 48 self.stopButton.move(530, 330) 49# self.stopButton.clicked.connect(self.onStopButton) 50 51 self.quitbutton2 = QPushButton('quit', self) 52 self.quitbutton2.move(530, 360) 53 self.quitbutton2.clicked.connect(self.quit) 54 55# def onStartButton(self): 56 57# def onStopButton(self): 58 59 def quit(self): 60 self.master.text("return") 61 self.master.setCurrentIndex(0) 62 63class Menu3(QWidget): 64 65 def __init__(self, parent): 66 super().__init__(parent) 67 self.master = parent 68 69 self.textbox = QLineEdit(self) # テキストボックス作成 70 self.textbox.move(20, 20) 71 self.textbox.resize(200,30) 72 73 self.button = QPushButton("Show text", self) # ボタン作成 74 self.button.move(20,80) 75 self.button.clicked.connect(self.on_click) # ボタン押下時のアクションを指定 76 self.show() 77 78 @pyqtSlot() 79 def on_click(self): 80 textboxValue = self.textbox.text() 81 QMessageBox.question(self, "Message - pythonspot.com", "You typed: " + textboxValue, QMessageBox.Ok, QMessageBox.Ok) 82 self.textbox.setText("") 83 84 self.button4 = QPushButton('登録', self) 85 self.button4.move(530, 100) 86 87 self.button4 = QPushButton('登録', self) 88 self.button4.move(530, 220) 89 90 self.button4 = QPushButton('登録', self) 91 self.button4.move(530, 340) 92 93 self.quitbutton3 = QPushButton('quit', self) 94 self.quitbutton3.move(530, 380) 95 self.quitbutton3.clicked.connect(self.quit) 96 97 def quit(self): 98 self.master.text("return") 99 self.master.setCurrentIndex(0) # StartMenuに移動 100 101 102class App(QTabWidget): 103 def __init__(self): 104 super().__init__() 105 self.setWindowTitle("加速度センシング") 106 107 self.tab1 = StartMenu(self) # 1個1個のタブがメニューに対応 108 self.tab2 = Menu2(self) 109 self.tab3 = Menu3(self) 110 111 self.addTab(self.tab1, "StartMenu") # タブページに追加 112 self.addTab(self.tab2, "Graph") 113 self.addTab(self.tab3, "InputData") 114 115 self.setStyleSheet("QTabWidget::pane { border: 0; }") # タブパネルのボーダーを削除 116 117# self.tabBar().hide() # タブバーを非表示に 118 self.resize(640, 470) # サイズの変更と 119 self.move(150, 20) # 立ち上げ位置の設定 120 121 def text(self, text): 122 print(text) 123 124#グラフ描画クラス 125class PlotCanvas(FigureCanvas): 126 127 def __init__(self, parent=None, width=5, height=5, dpi=100): 128 self.fig = Figure(figsize=(width, height), dpi=dpi) 129 self.axes = self.fig.add_subplot(111) 130 super(PlotCanvas, self).__init__(self.fig) 131 self.setParent(parent) 132 133 FigureCanvas.setSizePolicy( 134 self, 135 QSizePolicy.Expanding, 136 QSizePolicy.Expanding 137 ) 138 FigureCanvas.updateGeometry(self) 139 self.plot() 140 141 def plot(self): 142# self.xser = serial.Serial("COM7") # シリアルポート 143 self.ser = serial.Serial("/dev/tty.usbserial-0001") # Macで作業用シリアルPORT 144 timer = QTimer(self) 145 timer.timeout.connect(self.updateFigure) 146 self.x = np.arange(0,10) 147 self.xlist_x = np.zeros(10).tolist() # B 148 self.xlist_y = np.zeros(10).tolist() # Y 149 self.xlist_z = np.zeros(10).tolist() # G 150 151 self.axes.set_ylim((-1000,1000)) 152 153 self.xlines1, = self.axes.plot(self.x, self.xlist_x) 154 self.xlines2, = self.axes.plot(self.x, self.xlist_y) 155 self.xlines3, = self.axes.plot(self.x, self.xlist_z) 156 157 timer.start(1) 158 159 def updateFigure(self): 160 161 self.x += 1 # plotデータの更新 162 self.data = self.ser.readline().rstrip() # \nまで読み込む(\nは削除) 163 accdata = self.data.decode('utf-8') 164 acc = accdata.split(",") 165 acc_x = float(acc[0])/10 + 155 166 acc_y = float(acc[1])/10 167 acc_z = float(acc[2])/10 - 1665 168 169 self.xlist_x.pop(0) 170 self.xlist_x.append(acc_x) 171 self.xlist_y.pop(0) 172 self.xlist_y.append(acc_y) 173 self.xlist_z.pop(0) 174 self.xlist_z.append(acc_z) 175 176 self.xlines1.set_data(self.x, self.xlist_x) 177 self.xlines2.set_data(self.x, self.xlist_y) 178 self.xlines3.set_data(self.x, self.xlist_z) 179 180 self.axes.set_xlim((self.x.min(), self.x.max())) 181 182 self.draw() 183# plt.pause(1) 184 185def main(): 186 app = QApplication(sys.argv) 187 188 ex1 = App() 189 ex1.show() 190 sys.exit(app.exec_()) 191 192if __name__ == '__main__': 193 main()
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/24 11:31