因此,在这个程序中,我可以通过更改切片器值来启动Qthread realtime plot,当我将slider值设置为零时,Qthread realtime plot停止绘图。
但有时当我再次尝试重新启动实时绘图时,绘图在短时间内看起来像是中断了,如图所示。
在这张图片中,在实际的线图下面有一个单行斜杠
用户界面
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上运行了这个代码)