
我是 pyqt5 初学者,用 Designer 工具创建 UI 文件然后转换 py ,然后添加 figure 放到 canvas ,再放到 QGraphicsView 的 setScene 输出 pyplot 绘图,结果报错了
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' ... 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 的报错?
TypeError: addWidget(self, QWidget, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 1 has unexpected type 'Figure_Canvas' ...... 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 报错,搞了半天没解决
1 ec0 2022 年 4 月 9 日 试着跑了下代码 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]) |
2 ALLROBOT OP @ec0 #1 1. 导入 from matplotlib.backends.backend_template import FigureCanvas ,改成你的 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 2. 和 3.随着导入改变,就成功跑通了 感谢!!!我还得想办法去除绘图周边的空白,使图片完整的显示~DPI 调小了字看不清 |