Hallo,
ich habe ein Klasse geschrieben, die ein PyQt5 QWidget erstellt und in diesem Fenster dann verschiedene Plots (Matplotlib) anzeigt.
Diese Klasse wird dann mehrmals, in einem gewissem Abstand, wo anders aufgerufen (mit jeweils anderen Daten für die Plots). Jedes Mal wird jetzt ein neues Fenster geöffnet. Ich möchte jetzt, dass das erste Mal ein Fenster erstellt wird und die folgenden Male die neuen Plots in mein altes Fenster geplotted werden. Weiß jemand, wie ich das machen kann? Das Ganze sollte möglichst in meiner "Widget-Klasse" realisiert werden.
Sorry, bin noch ein Anfänger mit PyQt. Google hat mir auch nicht so wirklich weitergeholfen. Danke schon einmal im Voraus.
PyQt5 - neue Plots in selbes Fenster
Erst mal danke für die schnelle Antwort. Hier ist der Code, in dem ich das Fenster erstelle und darin plotte.
Code: Alles auswählen
class plotWindow(QWidget):
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout
from PyQt5 import QtCore
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
from scipy.signal import butter, lfilter
def __init__(self, data, number):
[...]
#Plotfenster wird hier erstellt
super().__init__()
self.title = 'Plot'
self.left = 100
self.top = 30
self.width = 1100
self.height = 1100
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)
self.toolbar = NavigationToolbar(self.canvas, self)
self.canvas.toolbar.hide()
grid = QGridLayout()
self.setLayout(grid)
grid.addWidget(self.canvas, 1,0,1,3)
grid.addWidget(self.toolbar, 0,0,1,3)
self.figure.subplots_adjust(left=0.05)
self.figure.subplots_adjust(right=0.95)
self.figure.subplots_adjust(bottom=0.1)
self.figure.subplots_adjust(top=0.9)
self.figure.subplots_adjust (hspace=0.3)
self.gs = gridspec.GridSpec(3,2)
[...]
self.plot_tr_stim_burst (self.data_tr, self.data_stim, self.data_burst, self.t)
self.plot_raw(self.data_x, self.data_y, self.data_z,self.t)
self.plot(self.t, self.data_x, self.data_y, self.data_z)
self.max_acceleration = self.get_max(self.data_x, self.data_y, self.data_z)
self.initUI()
def initUI(self):
self.setGeometry(self.left, self.top, self.width, self.height)
self.setWindowTitle(self.title)
self.show()
[...]
Bitte gewöhn dir das sofort ab die Importe innerhalb des class-Statements zu machen. Das macht man so nicht. Die gehören an den Anfang des Moduls.
Und zu deinem eigentlichen Problem: da du alles im Konstruktor machst, bist du natürlich gezwungen ein Widget neu zu machen.
Wenn du stattdessen den Code in eine Methode packst, kannst du entweder
- den canvas aus dem Parent entfernen & neu erstellen.
- den canvas selbst einfach leeren & dann neu Plotten. Wie genau das geht musst du mal in der Doku nachschlagen bzw im Interpreter mit rumspielen.
Und zu deinem eigentlichen Problem: da du alles im Konstruktor machst, bist du natürlich gezwungen ein Widget neu zu machen.
Wenn du stattdessen den Code in eine Methode packst, kannst du entweder
- den canvas aus dem Parent entfernen & neu erstellen.
- den canvas selbst einfach leeren & dann neu Plotten. Wie genau das geht musst du mal in der Doku nachschlagen bzw im Interpreter mit rumspielen.
Scheint über die figure zu gehen: https://stackoverflow.com/questions/821 ... matplotlib