Hallo Forum,
ich habe ein USB Oszilloskop bei dem ich die Messdaten Visualisieren will. Zusätzlich will ich die Daten modifizieren und entsprechend graphisch darstellen. Für die Visualisierung nutze ich PYQT5 und Matplotlib. Bei der Initialisierung lassen sich die Messfenster erzeugen. Die Messkurven (simulierter Sinus und Cosinus) können dargestellt werden. Jedoch lassen sich die Daten über einen Timer nicht aktualisieren. In den entsprechenden Python Fachbüchern kann ich leider auch nichts zu dem Fehler finden. Ich erhalte die Fehlermeldung " object has no Attribute ´_ax1´". Hat jemand einen guten Rat wo mein Fehler liegt?
Vielen Dank für eure Unterstützung und Anmerkungen vorab!
Jürgen
---------------------------------------------------------------Begin CODE--------------------------------------
import time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QAction, QLineEdit, QMessageBox, QLabel
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import numpy as np
class Window(QtWidgets.QWidget):
def __init__(self):
super(Window, self).__init__()
figure1 = Figure()
figure2 = Figure()
figure3 = Figure()
figure4 = Figure()
canvas1 = FigureCanvas(figure1)
canvas2 = FigureCanvas(figure2)
canvas3 = FigureCanvas(figure3)
ax1 = figure1.add_subplot(111)
ax2 = figure2.add_subplot(111)
ax3 = figure3.add_subplot(111)
toolbar1 = NavigationToolbar(canvas1, self)
toolbar2 = NavigationToolbar(canvas2, self)
toolbar3 = NavigationToolbar(canvas3, self)
mainLayout = QtWidgets.QGridLayout()
mainLayout.addWidget(toolbar1,0,0)
mainLayout.addWidget(toolbar2,0,1)
mainLayout.addWidget(toolbar3,2,0)
mainLayout.addWidget(canvas1,1,0)
mainLayout.addWidget(canvas2,1,1)
mainLayout.addWidget(canvas3,3,0)
ax1.set_title("Messsignal")
ax2.set_title("Analyse 1")
ax3.set_title("Analyse 2")
self.setLayout(mainLayout)
self.setWindowTitle("Signal Analye")
time = np.arange(0, 50, 0.1);
# Amplitude of the sine wave is sine of a variable like time
# Testsignal
amplitude = np.sin(time)
ax1.set_title("Messsignal")
ax1.plot(time,amplitude*10)
time2 = np.arange(0, 50, 0.1);
amplitude2 = np.cos(time2)
ax2.plot(time2,amplitude2)
amplitude3 = amplitude + amplitude2
ax3.plot(time2,amplitude3)
#---------------Timer------------
self._timer = canvas1.new_timer(100, [(self._update_canvas, (),{})])
self._timer.start()
#Aktualisierung des Messsignals
def _update_canvas(self):
self._ax1.clear()
t = nplinespace(0, 10, 0)
self._ax1.plot(t, np.sin(t + time.time()))
self._ax1.figure.canvas1.draw()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
mainWin = Window()
mainWin.show()
sys.exit(app.exec_())
----------------------------------------------------------Ende CODE---------------------------------------------------------------------------
Visualisierung von Messdaten (Oszilloskop)
Also ich weiss zwar nicht wie dein USB-Oszilloskop funktioniert, aber
du hast in " def _update_canvas(self):" dreimal "_ax1" anstatt "ax1"
Den Unterstrich habe ich mal wegemacht und das Fenster mit
den drei Plots wurde fehlerfrei angezeigt(nur den Timerstart
habe ich auskommentiert, weil sonst das Fenster immer
geschlossen wurde)
https://drive.google.com/file/d/1hwWoTY ... T5AcM/view
du hast in " def _update_canvas(self):" dreimal "_ax1" anstatt "ax1"
Den Unterstrich habe ich mal wegemacht und das Fenster mit
den drei Plots wurde fehlerfrei angezeigt(nur den Timerstart
habe ich auskommentiert, weil sonst das Fenster immer
geschlossen wurde)
https://drive.google.com/file/d/1hwWoTY ... T5AcM/view
Vielen Dank für Deine Info. Der Timer ist aber genau das Problem, genaugenommen dass was in der Funktion steht. Über den Timer soll das 1ste Messfenster mit Messdaten aktualisiert werden. Der Timer wird auch ordnungsgemäß aufgerufen. Jedoch gibt es eine Fehlermeldung "'Window' object has no attribute 'ax1'" bzw. wenn ax1 anders definiert ist mit "'Window' object has no attribute '_ax1'" und das 1ste Fenster wird nicht aktualisiert.
Ich bin mal so frei, deinen Code in Code-Tags zu setzen, damit man ihn lesen kann:
Das offensichtliche Problem ist, dass alle deine Variablen in der Klasse als Klassen- und nicht als Instanzvariablen angelegt sind. Also alles, was in __init__ angelegt wird.
figure1 ist also self.figure1, etc. Deshalb wird auch self.ax1 nicht gefunden, wenn man versucht darauf zuzugreifen.
Code: Alles auswählen
import time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QAction, QLineEdit, QMessageBox, QLabel
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import numpy as np
class Window(QtWidgets.QWidget):
def __init__(self):
super(Window, self).__init__()
figure1 = Figure()
figure2 = Figure()
figure3 = Figure()
figure4 = Figure()
canvas1 = FigureCanvas(figure1)
canvas2 = FigureCanvas(figure2)
canvas3 = FigureCanvas(figure3)
ax1 = figure1.add_subplot(111)
ax2 = figure2.add_subplot(111)
ax3 = figure3.add_subplot(111)
toolbar1 = NavigationToolbar(canvas1, self)
toolbar2 = NavigationToolbar(canvas2, self)
toolbar3 = NavigationToolbar(canvas3, self)
mainLayout = QtWidgets.QGridLayout()
mainLayout.addWidget(toolbar1,0,0)
mainLayout.addWidget(toolbar2,0,1)
mainLayout.addWidget(toolbar3,2,0)
mainLayout.addWidget(canvas1,1,0)
mainLayout.addWidget(canvas2,1,1)
mainLayout.addWidget(canvas3,3,0)
ax1.set_title("Messsignal")
ax2.set_title("Analyse 1")
ax3.set_title("Analyse 2")
self.setLayout(mainLayout)
self.setWindowTitle("Signal Analye")
time = np.arange(0, 50, 0.1);
# Amplitude of the sine wave is sine of a variable like time
# Testsignal
amplitude = np.sin(time)
ax1.set_title("Messsignal")
ax1.plot(time,amplitude*10)
time2 = np.arange(0, 50, 0.1);
amplitude2 = np.cos(time2)
ax2.plot(time2,amplitude2)
amplitude3 = amplitude + amplitude2
ax3.plot(time2,amplitude3)
#---------------Timer------------
self._timer = canvas1.new_timer(100, [(self._update_canvas, (),{})])
self._timer.start()
#Aktualisierung des Messsignals
def _update_canvas(self):
self._ax1.clear()
t = nplinespace(0, 10, 0)
self._ax1.plot(t, np.sin(t + time.time()))
self._ax1.figure.canvas1.draw()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
mainWin = Window()
mainWin.show()
sys.exit(app.exec_())
figure1 ist also self.figure1, etc. Deshalb wird auch self.ax1 nicht gefunden, wenn man versucht darauf zuzugreifen.