PyQt5 - neue Plots in selbes Fenster

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Matze94
User
Beiträge: 2
Registriert: Mittwoch 10. Januar 2018, 11:24

Mittwoch 10. Januar 2018, 11:36

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.
__deets__
User
Beiträge: 4034
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 10. Januar 2018, 11:41

Ich sehe keinen Grund, warum das nich funktionieren sollte. Was ich genauso wenig sehe ist Code, womit man dann auch nur mich den Achseln zucken kann.
Matze94
User
Beiträge: 2
Registriert: Mittwoch 10. Januar 2018, 11:24

Mittwoch 10. Januar 2018, 13:57

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()
        
       [...]
       
     
__deets__
User
Beiträge: 4034
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 10. Januar 2018, 14:27

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.
__deets__
User
Beiträge: 4034
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 10. Januar 2018, 14:31

Antworten