Skip to content Skip to sidebar Skip to footer

How Can I Automatically Update Data In Pyqtgraph?

I'm trying to plot candlesticks. I referred to this question and answer( The fastest way to add a new data bar with pyqtgraph ) I want my program to update and plot new candlestick

Solution 1:

Many times non-native elements for Qt generate that behavior, Qt is a framework that has libraries for many tasks like the ones you want to do, a Qt-style solution would be to use QThreads and in that case we would use signals to update the data, but another solution but it is simple to use QRunnable and QThreadPool as I show below:

class PlotRunnable(QtCore.QRunnable):
    def __init__(self, it):
        QtCore.QRunnable.__init__(self)
        self.it = it

    def run(self):
        while True:
            data = self.it.data
            data_len = len(data)
            rand = random.randint(0, len(data)-1)
            new_bar = data[rand][:]
            new_bar[0] = data_len
            data.append(new_bar)

            QtCore.QMetaObject.invokeMethod(self.it, "set_data",
                                     QtCore.Qt.QueuedConnection,
                                     QtCore.Q_ARG(list, data))
            QtCore.QThread.msleep(1000)


class CandlestickItem(pg.GraphicsObject):
    def __init__(self):
        pg.GraphicsObject.__init__(self)
        self.flagHasData = False

    @QtCore.pyqtSlot(list)
    def set_data(self, data):
        self.data = data 
        self.flagHasData = True
        self.generatePicture()
        self.informViewBoundsChanged()

    def generatePicture(self):
        [...]

app = QtGui.QApplication([])

data = [  
    [1., 10, 13, 5, 15],
    [2., 13, 17, 9, 20],
    [3., 17, 14, 11, 23],
    [4., 14, 15, 5, 19],
    [5., 15, 9, 8, 22],
    [6., 9, 15, 8, 16],
]
item = CandlestickItem()
item.set_data(data)

plt = pg.plot()
plt.addItem(item)
plt.setWindowTitle('pyqtgraph example: customGraphicsItem')


runnable = PlotRunnable(item)
QtCore.QThreadPool.globalInstance().start(runnable)

if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

Post a Comment for "How Can I Automatically Update Data In Pyqtgraph?"