pyqt信号没有更新matplotlib FigureCanvasQTAgg并延迟

时间:2014-11-10 11:18:35

标签: python matplotlib pyqt pyqt4 qthread

我正在使用PyQt4构建GUI。目前我有一个OpenGLWidget(),它在Solver()的每个第N个时间步中显示几何形状。我添加了新的图形窗口 - GraphWidget()来绘制“一些有趣的”数据。在Solver()中,我使用信号刷新Open GL小部件 - self.updateGL()。我已将现有信号连接到重绘FigureCanvasQTAgg但未绘制任何内容。 这是 SimulationControlWidget

class SimulationControlWidget(self):
    self.OpenGLWidget = OpenGLWidget() #opengl widget
    self.GraphWidget = GraphWidget() #plot widget with matplotib

    # solver in new thread
    self.solver = Solver()
    self._solver_thread = QThread()
    self._solver_thread.start()
    self.solver.moveToThread(self._solver_thread)

    # signals
    #this signal is OK
    OKself.solver.solveODE.repaintGL_signal.signal_repaintGL.connect(self.OpenGLWidget.updateGL) 

    #this signal is not OK
    self.solver.solveODE.repaintGL_signal.signal_repaintGL.connect(self.GraphWidget.plot_graph)

这是 GraphWidget 类:

class GraphWidget(QtGui.QWidget):
    def __init__(self, MBD_system=[], parent=None, flags=0):
        super(GraphWidget, self).__init__(parent)
        self.fig = Figure((8.0, 4.0), dpi=100)
        self.canvas = FigureCanvas(self.fig)
        self.axes = self.fig.add_subplot(111)
        #   added button to manually execute function plot_graph()
        self.plot_button = QtGui.QPushButton("&Show")

        self.layout = QtGui.QVBoxLayout(self)
        self.layout.addWidget(self.canvas)
        self.layout.addWidget(self.plot_button)
        self.canvas.draw()

        #   signal to plot data with button self.plot_button
        self.plot_button.clicked.connect(self.plot_graph)

    def plot_graph(self):
        print 'plotting graph!'
        self.axes.cla()
        self.axes.plot(np.random.rand(10, 2))

        self.canvas.draw()

我遇到的问题是:如果我手动点击按钮self.plot_button,则执行函数plot_graph()(正确绘制随机数据,并在eclipse pydev控制台中打印文本plotting_graph!) 。但是如果我尝试用信号执行函数plot_graph(),则只在控制台中打印文本plotting_graph!并且不绘制数据。我还注意到,如果我使用signal,函数plot_graph()在模拟停止后正在执行(由于信号)。应该是什么解决方案?如果它更有用,我也可以将链接放到整个代码中。我想我必须同步这个...但是如何?

0 个答案:

没有答案