GraphicsWindow embedded to PyQt UI - how to trigger QTimer from main class?

43 views
Skip to first unread message

roman.grz...@gmail.com

unread,
Jan 31, 2019, 6:24:55 AM1/31/19
to pyqtgraph
I'd like to embed pyqtgraph window into my GUI which was created in QtDesiger. At first I just created new window and defined everything inside main GUI class (MyApp) and everything is working fine this way.

Now I created a Plotter class for GraphicsWindow, saved it to file pyqtwindow.py, and promoted it in Designer so now when I run my GUI, the window of pyqtgraph is there. 
The rest of GUI stuff is inside MyApp class in GUI.py file. How can I connect signals between these classes? I also have different class in different file for storing the data (dataframes.py, which is defined as dfs in MyApp), how do I read the results from this class inside my Plotter class?

class Plotter(pg.GraphicsWindow):
    def __init__(self, parent=None, **kargs):
        pg.GraphicsWindow.__init__(self, **kargs)
        self.setParent(parent)
        self.plt = self.addPlot(row=1, col=0, title="Plot",
                                    labels={'left': 'Voltage [V]',
                                            'bottom': 'time [s]'})
        self.curve = self.plt.plot(pen='b')
        self.label_cords = pg.LabelItem(justify="right")
        self.addItem(self.label_cords)
        self.proxy = pg.SignalProxy(self.plt.scene().sigMouseMoved, rateLimit=60,
                                    slot=self.mouseMoved)
        self.plot_timer = pg.QtCore.QTimer()
        self.plot_timer.timeout.connect(self.updatePlot)
        
    def startPlot(self):
    self.plot_timer.start(1000) # how can I trigger it from main class MyApp, which has all other signals/slots connected ?
    def stopPlot(self):
    self.plot_timer.stop() # I'd like to stop the trigger the same way (pushing STOP button which is in MyApp class)
    def mouseMoved(self, evt):
        self.mousePoint = self.plt.vb.mapSceneToView(evt[0])
        self.label_cords.setText("<span style='font-size: 8pt; color: white'> x = %0.4f, <span style='color: white'> y = %0.4f</span>"
           % (self.mousePoint.x(), self.mousePoint.y()))
    
    def updatePlot(self):
        self.curve.clear()
        self.curve.setData(dfs.data_dictionary['time'], dfs.data_dictionary['Voltage'])

if __name__ == '__main__':
    w = Plotter()
    w.show()
    QtGui.QApplication.instance().exec_()


Patrick

unread,
Feb 3, 2019, 7:26:51 PM2/3/19
to pyqtgraph
Hi,

I think all this is fairly straightforward. You just need to connect your GUI button signals to your startPlot/stopPlot mothods. From the init of your MyApp class, something like:
self.startButton.clicked.connect(self.plotter.startPlot) # where plotter is a reference to the Plotter window inside your GUI.

For getting the data to the Plotter class, you will need to pass in a reference to your data structure somehow, either in init and/or a method. So:

class Plotter(pg.GraphicsWindow):
   
def __init__(self, datasource, parent=None, **kargs):
       
# ...
       
# self.dfs = datasource
       
# ...
   
   
# ...

   
def setDataSource(self, datasource):
       
self.dfs = datasource

   
def updatePlot(self):
       
# self.curve.clear() # Note, you don't need to clear before doing a setData
       
self.curve.setData(self.dfs.data_dictionary['time'], self.dfs.data_dictionary['Voltage'])


Patrick
Reply all
Reply to author
Forward
0 new messages