重新启动realtime p时pyqtgraph realtime plot中断

2024-10-03 21:30:17 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,在这个程序中,我可以通过更改切片器值来启动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_()

这是我的线程代码:

动态线程.py

    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上运行了这个代码)


Tags: fromimportselfifvaluedefcountgui