Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何强制matplotlib更新打印_Python_Qt4_Matplotlib_Pyqt4_Signals Slots - Fatal编程技术网

Python 如何强制matplotlib更新打印

Python 如何强制matplotlib更新打印,python,qt4,matplotlib,pyqt4,signals-slots,Python,Qt4,Matplotlib,Pyqt4,Signals Slots,我试图构建一个小GUI,它有一个绘图,每次读取新数据样本时都会更新。我不希望使用计时器运行它,因为数据将以不同的间隔到达。相反,我尝试使用信号来实现,其中数据采集函数在读取数据时发出信号,然后绘制函数在绘制完成时发出信号 现在的问题是,调用canvas.draw()后,画布没有立即更新。当这个程序运行时,data_collect()和paint()交替发送信号,但直到我停止该过程后,图形才会更新。如何在调用paint()时强制matplotlib更新地物 下面是一段相对简单的示例代码,它不是最优

我试图构建一个小GUI,它有一个绘图,每次读取新数据样本时都会更新。我不希望使用计时器运行它,因为数据将以不同的间隔到达。相反,我尝试使用信号来实现,其中数据采集函数在读取数据时发出信号,然后绘制函数在绘制完成时发出信号

现在的问题是,调用canvas.draw()后,画布没有立即更新。当这个程序运行时,data_collect()和paint()交替发送信号,但直到我停止该过程后,图形才会更新。如何在调用paint()时强制matplotlib更新地物

下面是一段相对简单的示例代码,它不是最优的,但希望能传达我正在尝试做的事情的味道

N_length = 150;
count = [0];

def sinval(delay):

    k = 0;
    x = [];

    # set up data vector with sinusoidal data in it.
    while k < N_length:  
        x.append(math.sin(2*math.pi*k/N_length));
        k += 1;

    def next():

        time.sleep(delay);
        outstring = "%0.3e" % (x[count[0]]);

        if (count[0] == (N_length-1)):
            count[0] = 0;
        else:
            count[0] += 1;

        return outstring;

    return next;


class DesignerMainWindow(QtGui.QMainWindow, Ui_mplMainWindow):

    def __init__(self, parent = None):
        super(DesignerMainWindow, self).__init__(parent)
        self.setupUi(self)

        QtCore.QObject.connect(self.mplStartButton, QtCore.SIGNAL("clicked()"), self.start_graph);
        QtCore.QObject.connect(self.mplStopButton, QtCore.SIGNAL("clicked()"), self.stop_graph);
        QtCore.QObject.connect(self.mplQuitButton, QtCore.SIGNAL("clicked()"), QtGui.qApp, QtCore.SLOT("quit()"));
        QtCore.QObject.connect(self, QtCore.SIGNAL("data_collect()"), self.data_collect);
        QtCore.QObject.connect(self, QtCore.SIGNAL("paint()"), self.paint);

    def start_graph(self):

        # generates first "empty" plots
        self.user = [];
        self.l_user, = self.mpl.canvas.ax.plot([], self.user, label='sine wave');

        # set up the axes. 
        self.mpl.canvas.ax.set_xlim(0, 300);
        self.mpl.canvas.ax.set_ylim(-1.1, 1.1);
        self.mpl.canvas.draw();

        # start the data collection process.
        self.delay = 0.05;
        self.next = sinval(self.delay);
        self.emit(QtCore.SIGNAL('data_collect()'));


    def data_collect(self):
        outstring = self.next();
        self.user.append(float(outstring.split()[0]));
        self.l_user.set_data(range(len(self.user)), self.user);
        self.emit(QtCore.SIGNAL('paint()'));


    def paint(self):
        self.mpl.canvas.draw();
        self.emit(QtCore.SIGNAL('data_collect()'));
N_长度=150;
计数=[0];
def sinval(延迟):
k=0;
x=[];
#设置包含正弦数据的数据向量。
当k
我想在paint()之后调用QCoreApplication::processEvents会有所帮助。更优雅的做法是使用单独的QThread进行读取。看看这个。

是我遗漏了什么,还是你遗漏了所有的绘图命令?无论是
data\u collect
还是
paint
似乎都没有任何绘图命令(如
self.mpl.canvas.ax.plot
)可以更改绘图。因此,调用
self.mpl.canvas.draw()
是否只是重新绘制相同的旧绘图?@~unutbu-他正在使用
self.l\u user.set\u data(…)
来设置更新绘图数据,而不是重新填写所有内容。(如果您只想更改绘图的数据,而不想重新绘制轴刻度等,那么这比调用plot要高效得多)我的理解是,更新l_user.set_数据,然后调用canvas.draw()将自动刷新图形。我尝试将paint(self)中的第一个命令更改为self.mpl.canvas.ax.plot(),但这似乎不起作用。我应该如何更改此命令?谢谢-@Joe和@User4211:好的,谢谢你的解释。谢谢!我必须在PyQt4中调用QtGui.QApplication.processEvents(),但这成功了。