代码之家  ›  专栏  ›  技术社区  ›  Jan sebastian

重新启动实时绘图时pyqtgraph实时绘图中断

  •  0
  • Jan sebastian  · 技术社区  · 6 年前

    因此,在这个程序中,我可以通过更改切片器值来启动Qthread realtime plot,当我将slider值设置为零时,Qthread realtime plot停止绘图。 但有时当我再次尝试重新启动实时绘图时,绘图在短时间内看起来像是中断了,如图所示。

    enter image description here

    在这张图片中,在实际的线图下面有一个单行斜杠

    用户界面

        from pyqtgraph.Qt import QtCore, QtGui
    from PyQt4 import QtCore,QtGui,uic
    import sys
    import time
    from collections import deque
    from DynamicThread import DynamicThread
    from ThreadRun import ThreadRun
    
    from GUI_ui import Ui_home
    
    class ui(QtGui.QTabWidget):
        akselerasi = 0
        curve = None
        dataGraph = deque(maxlen=20)
        x1 = []
        y1 = []
        aa = False
    
        def __init__(self,parent = None):
            super(ui,self).__init__(parent = parent)
    
            self.UiMeja = Ui_home()
            self.UiMeja.setupUi(self)
    
            self.UiMeja.akselerasi.setMinimum(0)
            self.UiMeja.akselerasi.setMaximum(50)
            self.UiMeja.akselerasi.setValue(0)
            self.UiMeja.akselerasi.valueChanged.connect(self.valueAkselerasi)
            self.UiMeja.akselerasi.sliderReleased.connect(self.getThread)
    
            self.threadDinamis = DynamicThread()
            self.threadDinamis.dataThread.connect(self.runningDynamic)
            ui.curve = self.UiMejaGetar.graph1.plot(pen=(255,0,0))
            self.UiMeja.graph1.setRange(xRange=None, yRange=[-1, 1 ])
            self.UiMeja.graph1.showGrid(x=True, y=True)
            self.UiMeja.graph1.setMouseEnabled(x=False, y=False)
            self.UiMejaGetar.l1.setText(str(self.UiMejaGetar.akselerasi.value()))
    
        def getThread(self):
    
            if self.sender() == self.UiMeja.akselerasi:
                ui.akselerasii = int(self.UiMeja.akselerasi.value())
    
            if GUI_MejaGetar.akselerasii > 0:
                if ui.aa == True:
                    print("second")
                    minRange = int(self.UiMeja.akselerasi.value()) * -1
                    self.UiMeja.graph1.setRange(xRange=None, yRange=[minRange, int(self.UiMeja.akselerasi.value()) ])
                    self.threadDinamis.trigrer(ui.akselerasii)
    
                else:
                    minRange = int(self.UiMeja.akselerasi.value()) * -1
                    self.UiMeja.graph1.setRange(xRange=None, yRange=[minRange, int(self.UiMeja.akselerasi.value()) ])
                    GUI_MejaGetar.aa = True
    
                    print("first")
                    self.threadDinamis.trigrer(GUI_MejaGetar.akselerasii)
                    self.threadDinamis.start()
            else:
                self.threadDinamis.stop()
                GUI_MejaGetar.aa = False
                GUI_MejaGetar.dataGraph.clear()
                GUI_MejaGetar.x1 = []
                GUI_MejaGetar.y1 = []
    
        def runningDynamic(self,generateData):
            #print(generateData['x'])
            GUI_MejaGetar.dataGraph.append({'x': generateData['x'], 'y': generateData['y']})
            GUI_MejaGetar.x1 = [item['x'] for item in GUI_MejaGetar.dataGraph]
            GUI_MejaGetar.y1 = [item['y'] for item in GUI_MejaGetar.dataGraph]
            GUI_MejaGetar.curve.setData(x=GUI_MejaGetar.x1, y=GUI_MejaGetar.y1)
    
    
    if __name__ == '__main__':
    
        app = QtGui.QApplication([])
        widget = GUI_MejaGetar()
    
        widget.show()
        app.exec_()
    

    这是我的线程代码:

        import time
    import sys
    from PyQt4 import QtGui, QtCore
    from PyQt4.QtCore import QTime, QTimer
    from randomMethod import randomMethod
    
    class DynamicThread(QtCore.QThread):
        dataThread = QtCore.pyqtSignal(object)
        dynamicGenerator = randomMethod()
        status = False
        intAkselerasi = 0
        def __init__(self, parent=None):
            QtCore.QThread.__init__(self,parent)
            #self.gui_text = None
    
        def trigrer(self,num):
            DynamicThread.intAkselerasi = num
    
        def do_work(self):
            i = 0
            listData = []
            count = 0
            test = 0
            #t = QTime()
            #t.start()
            print("starting.....")
    
            while DynamicThread.status == True:
                if DynamicThread.intAkselerasi > 0:
                    if not listData:
                        value = int(DynamicThread.dynamicGenerator.bits(), 2)
                        dat = value % DynamicThread.intAkselerasi
                        listData.append(dat)
                        count = dat
                    else:
                        value = int(DynamicThread.dynamicGenerator.bits(), 2)
                        dat = value % DynamicThread.intAkselerasi
    
                        if listData[i - 1] < 0:
                            dat = dat * -1
                        test = 0
                        test = count + dat
                        lowLimit = DynamicThread.intAkselerasi * -1
                        if DynamicThread.intAkselerasi > test > lowLimit:
                            count = count + dat
                            listData.append(count)
                        else:
                            if dat < lowLimit:
                                temp = abs(dat)
                                count = count + temp
                                listData.append(temp)
                            else:
                                temp = dat * -1
                                count = count + temp
                                listData.append(temp)
                    print(listData[i])
                    print("test: ",test)
                    print("count: ",count)
                    self.dataThread.emit({'x': i,'y':count})
                    i = i + 1
                    time.sleep(0.1)
                else:
                    DynamicThread.status = False
                    print("stop")
                    break
            print("stoping the process....")
    
        def run(self):
            self.do_work()
    
        def start(self):
            DynamicThread.status = True
            super(DynamicThread, self).start()
    
        def stop(self):
            DynamicThread.status = False
    

    (注意:我在raspberry pi 3上运行了这个代码)

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jan sebastian    6 年前

    GUI_MejaGetar.dataGraph.clear()
    GUI_MejaGetar.x1 = []
    GUI_MejaGetar.y1 = []