• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ALLROBOT
V2EX  ›  程序员

pyqt5 输出绘图出错 Qt.WindowFlags()): argument 1 has unexpected type 'Figure_Canvas'

  •  
  •   ALLROBOT · Apr 8, 2022 · 2080 views
    This topic created in 1503 days ago, the information mentioned may be changed or developed.

    说明

    我是 pyqt5 初学者,用 Designer 工具创建 UI 文件然后转换 py ,然后添加 figure 放到 canvas ,再放到 QGraphicsView 的 setScene 输出 pyplot 绘图,结果报错了

    报错 1

    Traceback (most recent call last):
      File "C:\Users\Administrator\PycharmProjects\Request_Project\Non_real_time_recognition.py", line 155, in <module>
        ui.setupUi(form)
      File "C:\Users\Administrator\PycharmProjects\Request_Project\Non_real_time_recognition.py", line 87, in setupUi
        proxy_widget=self.scene.addWidget(canvas)
    TypeError: addWidget(self, QWidget, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 1 has unexpected type 'FigureCanvasTemplate'
    

    代码 1

    ...
    class UiForm(object):
        def __init__(self):
            E1 = scio.loadmat('S1_E1_A1.mat')
            # display emg data,shape:[2292526,16]
            self.E1_emg = E1['emg']
            self.E1_label = E1['restimulus']
        def setupUi(self,Form):
            Form.setObjectName("Form")
            Form.resize(550, 419)
            Form.setFixedSize(Form.width(), Form.height())
            # plt.plot(self.E1_emg[0:200000] * 20000)
            # plt.plot(self.E1_label[0:200000]*100)
    
            self.Plotting = QtWidgets.QGraphicsView(Form)
            self.Plotting.setGeometry(QtCore.QRect(10, 10, 361, 171))
            self.Plotting.setObjectName("Plotting")
            self.scene=QtWidgets.QGraphicsScene()
    
            figure=Figure()
            axes=figure.gca()
            axes.set_title("sEMG")
            x=np.linspace(0,200000,num=200000)
            y=self.E1_emg[0:200000] * 20000
            axes.plot(x,y,"-k",label="sEMG")
            axes.legend()
            axes.grid(True)
    
            canvas=FigureCanvas(figure)
    
            proxy_widget=self.scene.addWidget(canvas)
            self.Plotting.setScene(proxy_widget)
    
            self.Image = QtWidgets.QGraphicsView(Form)
            self.Image.setGeometry(QtCore.QRect(390, 10, 151, 171))
            self.Image.setObjectName("Image")
            .....
    

    换别的方法,似乎都是 Figure canvas 的报错?

    报错 2

    TypeError: addWidget(self, QWidget, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 1 has unexpected type 'Figure_Canvas'
    

    代码 2

    ......
    class Figure_Canvas(FigureCanvas):
        def __init__(self, parent=None, width=360, height=170, dpi=100):
            E1 = scio.loadmat('S1_E1_A1.mat')
            print(E1.keys())
            self.E1_emg = E1['emg']
            self.E1_label = E1['restimulus']
            fig = Figure(figsize=(width, height), dpi=100)
            FigureCanvas.__init__(self, fig)
            self.axes = fig.add_subplot(111)
    	# 测试输出
        def updatePlot(self):
            x = [1,2,3,4,5,6,7,8,9]
            y = [23,21,32,13,3,132,13,3,1]
            self.axes.plot(x, y)
    
    class UiForm(object):
        def __init__(self):
    
            f = h5py.File('DB2_S1_Image_[200_16_1].h5', 'r')
            image = np.array(f['imageData'])
            print(image.shape)
            label = np.array(f['imageLabel'])
            print(label.shape)
            f.close()
            # self.figure=MyFigureCanvas()
    
        def setupUi(self,Form):
            Form.setObjectName("Form")
            Form.resize(550, 419)
            Form.setFixedSize(Form.width(), Form.height())
            # plt.plot(self.E1_emg[0:200000] * 20000)
            # plt.plot(self.E1_label[0:200000]*100)
            #
            # self.Plotting = QtWidgets.QGraphicsView(Form)
            # self.Plotting.setGeometry(QtCore.QRect(10, 10, 361, 171))
            # self.Plotting.setObjectName("Plotting")
            # self.scene=QtWidgets.QGraphicsScene()
            #
            # figure=Figure()
            # axes=figure.gca()
            # axes.set_title("sEMG")
            # x=np.linspace(0,200000,num=200000)
            # y=self.E1_emg[0:200000] * 20000
            # axes.plot(x,y,"-k",label="sEMG")
            # axes.legend()
            # axes.grid(True)
            #
            # canvas=FigureCanvas(figure)
            #
            # proxy_widget=self.scene.addWidget(canvas)
            # self.Plotting.setScene(proxy_widget)
    
            self.gridLayoutWidget = QtWidgets.QWidget(Form)
            self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 361, 171))
            self.gridLayoutWidget.setObjectName("gridLayoutWidget")
    
    
            self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget)
            self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
            self.gridLayout_2.setObjectName("gridLayout_2")
    
            # ===通过 graphicview 来显示图形
    
            self.graphicview = QtWidgets.QGraphicsView(self.gridLayoutWidget)
            self.graphicview.setObjectName("graphicview")
            self.gridLayout_2.addWidget(self.graphicview, 0, 0)
    
            self.dr = Figure_Canvas()
            self.dr.updatePlot()  # 画图
    
            self.graphicscene = QtWidgets.QGraphicsScene(Form)
            self.graphicscene.addWidget(self.dr)
            self.graphicview.setScene(self.graphicscene)
            self.graphicview.show()
            ......
    

    怎么解决啊😂,Matplotlib 嵌入 pyqt 报错,搞了半天没解决

    ec0
        1
    ec0  
       Apr 9, 2022   ❤️ 1
    试着跑了下代码

    1. 你的 FigureCanvas 和 Figure 是怎么导入(import)的?我是这样
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.figure import Figure

    2. 代码 1 的 setupUi 函数里的
    self.Plotting.setScene(proxy_widget)
    我改成了 self.Plotting.setScene(self.scene)

    3. 代码 2 的 class Figure_Canvas 的 init 函数里,参数的 width 和 height 设置成了 360,170 然后传给了 Figure ,Figure 的 figsize 的单位是 inches 而不是 px ,360 inches 太大了,会 Out of memory
    所以我把 Figure(figsize=(width, height), dpi=100) 改成了 Figure(dpi=100) ,使用默认的 figsize( [6.4, 4.8])
    ALLROBOT
        2
    ALLROBOT  
    OP
       Apr 9, 2022
    @ec0 #1
    1. 导入 from matplotlib.backends.backend_template import FigureCanvas ,改成你的 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

    2. 和 3.随着导入改变,就成功跑通了

    感谢!!!😂我还得想办法去除绘图周边的空白,使图片完整的显示~DPI 调小了字看不清
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2447 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:04 · PVG 00:04 · LAX 09:04 · JFK 12:04
    ♥ Do have faith in what you're doing.