小编Lei*_*hti的帖子

使用pyqtgraph和线程进行实时绘图

这有点长,第一部分只是问题的描述,第二部分是我的“修复”是否正确的问题。

我从python编程开始。我创建了一个与Arduino通信的程序,该程序读取了我们熔炼实验室的熔炉温度。然后将温度用于PID算法中,并将输出设置为Arduino。通信是通过pyserial完成的。到目前为止,所有工作都可以进行,包括实时绘制温度信号,PID变量等。该脚本包括一个主循环和3个线程(串行通信,从串行端口读取的数据移位器,QWidget的设定温度以及PID算法的输出。此值用于创建一个数组,以在pyqtgraph中显示。第三个线程将数据从datashifter移至QWidget。

使用我的Linux笔记本时,一切正常,GUI永不停止更新。相反,当使用任何Windows主机时,我有一些pyqtgraphs停止刷新的问题。行为很奇怪,因为我使用相同的numpy数组(只是不同的列)或多或少地同时设置了所有数据-有些图刷新的时间更长(小时),有些图刷新的时间更早(分钟)。在或多或少地搜索了互联网漏洞之后;-)我认为我发现了问题:它是将数据从线程传递到GUI的过程。一些虚拟代码来解释发生了什么:

DataUpdaterToGUI(QThread):

#sets the QWidget from main loop
def setGUI(self, gui):
    self.gui = gui

def run()
    while True:
        with lock(): # RLock() Instance
           copyArray = self.dataArray[:] # copy the array from the shifter
           self.gui.plot1.copyArray(dataArray[:, 0], copyArray[:, 1])
           self.gui.plot2.copyArray(dataArray[:, 0], copyArray[:, 2])
           # self.gui.update()
           # QApplication.instance().processEvents() 
Run Code Online (Sandbox Code Playgroud)

调用self.gui.update()或processEvents()都不会对结果产生任何影响:在一段时间后(在Windows上),绘图停止重绘。

现在,我有一个非常简单的示例,只想确保我是否正确使用了线程填充。它工作正常,但我有一些问题:

  • 信号插槽方法是否复制传递的数据?
  • 为什么没有必要调用QWidget的update()方法?
  • 使用信号时是否必须使用任何类型的锁?

class Main(QWidget):
    def __init__(self):
        super().__init__()

        self.layout = QGridLayout(self)
        self.graph = pg.PlotWidget()
        self.graph.setYRange(0,1000)
        self.plot = self.graph.plot()
        self.layout.addWidget(self.graph,0,0)
        self.show()

    def make_connection(self, data_object):
        data_object.signal.connect(self.grab_data)

    @pyqtSlot(object)
    def grab_data(self, data):
        print(data)
        self.plot.setData(data)


class …
Run Code Online (Sandbox Code Playgroud)

python plot multithreading pyqtgraph pyqt5

2
推荐指数
1
解决办法
939
查看次数

标签 统计

multithreading ×1

plot ×1

pyqt5 ×1

pyqtgraph ×1

python ×1