Matplotlib draw()将无法在MacOS上的pyqt环境中运行

问题描述 投票:0回答:1

我正在尝试更新嵌入pyqt5窗口的matplotlib图。我使用self.canvas.draw()(在update函数中)更新函数中的绘图以重绘图形。这在Window上工作正常,但它不适用于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()

编辑

我试着在@ImportanceOfBeingErnest的Qt(qazxsw poi)中使用matplotlib的例子来嵌入数字

https://matplotlib.org/gallery/user_interfaces/embedding_in_qt_sgskip.html

但问题仍然存在。

python matplotlib draw
1个回答
0
投票

来自@ImportanceOfBeingErnest的回答

由于我没有任何使用Mac的经验,我可能无法在这里进一步提供帮助,但最后的建议可能是用# 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() 替换.draw()。 (两者都适用于这种情况,但你永远不会知道...)

© www.soinside.com 2019 - 2024. All rights reserved.