代码之家  ›  专栏  ›  技术社区  ›  ymmx

Matplotlib draw()无法在MacOS上的pyqt环境中工作

  •  0
  • ymmx  · 技术社区  · 7 年前

    我曾经 self.canvas.draw() (在 update 函数)更新函数中的绘图以重新绘制图形。这在窗口上运行良好,但在MacOS上不起作用。 我不明白为什么,是否有解决办法?

    事实上,我需要在轴上点击,以便图被更新。。。奇怪的

    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    import numpy as np
    import sys
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
    
    class StimEdit(QMainWindow):
        def __init__(self, parent=None):
            super(StimEdit, self).__init__()
            self.parent = parent
    
            self.centralWidget = QWidget()
            self.color = self.centralWidget.palette().color(QPalette.Background)
            self.setCentralWidget(self.centralWidget)
            self.mainHBOX_param_scene = QHBoxLayout()
    
            self.set_Stims()
            self.mainHBOX_param_scene.addWidget(self.Stimulation)
            self.centralWidget.setLayout(self.mainHBOX_param_scene)
    
        def set_Stims(self):
            self.Stimulation = QGroupBox('Stim N°1')
    
            self.layout_Stimulation_courbe = QVBoxLayout()
            self.layout_Stimulation = QHBoxLayout()
    
            self.button = QPushButton('push')
            self.masceneparam = paramViewer(self)
            self.button.clicked.connect(self.button_fun)
    
            self.layout_Stimulation_courbe.addWidget(self.masceneparam)
            self.layout_Stimulation_courbe.addWidget(self.button)
            self.Stimulation.setLayout(self.layout_Stimulation_courbe)
    
        def button_fun(self):
            self.masceneparam.update()
            self.parent.processEvents()
    
    
    
    
    class paramViewer(QGraphicsView):
        def __init__(self, parent=None):
            super(paramViewer, self).__init__(parent)
            self.parent=parent
            self.scene = QGraphicsScene(self)
            self.setScene(self.scene)
            self.figure = plt.figure()
            self.canvas = FigureCanvas(self.figure)
            self.toolbar = NavigationToolbar(self.canvas, self)
    
            self.axes_stim=self.figure.add_subplot(111)
            self.canvas.setGeometry(0, 0, 1600, 500 )
            layout = QVBoxLayout()
            layout.addWidget(self.toolbar)
            layout.addWidget(self.canvas)
            self.setLayout(layout)
            self.canvas.show()
    
    
        def update(self):
            self.axes_stim.clear()
            t = np.arange(1000)/100
            self.axes_stim.plot(t,np.sin(2*np.pi*np.random.uniform()*100*t))
            self.canvas.draw()
    
    
    def main():
        app = QApplication(sys.argv)
        ex = StimEdit(app)
        ex.setWindowTitle('St ')
        ex.show()
        sys.exit(app.exec_( ))
    
    
    if __name__ == '__main__':
        main()
    

    我尝试使用matplotlib的例子来嵌入Qt中的图形( https://matplotlib.org/gallery/user_interfaces/embedding_in_qt_sgskip.html )来自@ImportanceOfBeingErnest

    # from PyQt5.QtGui import *
    # from PyQt5.QtWidgets import *
    import numpy as np
    import sys
    import matplotlib.pyplot as plt
    from matplotlib.figure import Figure
    
    from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
    if is_pyqt5():
        from matplotlib.backends.backend_qt5agg import (
            FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
    else:
        from matplotlib.backends.backend_qt4agg import (
            FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
    from matplotlib.figure import Figure
    
    class StimEdit(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(StimEdit, self).__init__()
            self.parent = parent
    
            self.centralWidget = QtWidgets.QWidget()
            self.setCentralWidget(self.centralWidget)
            self.mainHBOX_param_scene = QtWidgets.QHBoxLayout()
    
            self.set_Stims()
            self.mainHBOX_param_scene.addWidget(self.Stimulation)
            self.centralWidget.setLayout(self.mainHBOX_param_scene)
    
        def set_Stims(self):
            self.Stimulation = QtWidgets.QGroupBox('Stim N°1')
    
            self.layout_Stimulation_courbe = QtWidgets.QVBoxLayout()
            self.layout_Stimulation = QtWidgets.QHBoxLayout()
    
            self.button = QtWidgets.QPushButton('push')
            self.masceneparam = paramViewer(self)
            self.button.clicked.connect(self.button_fun)
    
            self.layout_Stimulation_courbe.addWidget(self.masceneparam)
            self.layout_Stimulation_courbe.addWidget(self.button)
            self.Stimulation.setLayout(self.layout_Stimulation_courbe)
    
        def button_fun(self):
            self.masceneparam.update()
            self.parent.processEvents()
    
    
    
    
    class paramViewer(QtWidgets.QGraphicsView):
        def __init__(self, parent=None):
            super(paramViewer, self).__init__(parent)
            self.parent=parent
            self.scene = QtWidgets.QGraphicsScene(self)
            self.setScene(self.scene)
            self.figure = Figure()
            self.canvas = FigureCanvas(self.figure )
            self.toolbar = NavigationToolbar(self.canvas, self)
    
            self.axes_stim=self.figure.add_subplot(111)
            self.canvas.setGeometry(0, 0, 1600, 500 )
            layout = QtWidgets.QVBoxLayout()
            layout.addWidget(self.toolbar)
            layout.addWidget(self.canvas)
            self.setLayout(layout)
            self.canvas.show()
    
    
        def update(self):
            self.axes_stim.clear()
            t = np.arange(1000)/100
            self.axes_stim.plot(t,np.sin(2*np.pi*np.random.uniform()*100*t))
            self.canvas.figure.canvas.draw()
            # self.canvas.draw()
    
    
    def main():
        app = QtWidgets.QApplication(sys.argv)
        ex = StimEdit(app)
        ex.setWindowTitle('St ')
        ex.show()
        sys.exit(app.exec_( ))
    
    
    if __name__ == '__main__':
        main()
    

    0 回复  |  直到 5 年前
        1
  •  0
  •   ymmx    6 年前

    .draw() 通过 .draw_idle()

    推荐文章