PyQt5 matplotlib画图 gridlayout 删除画布

PyQt5 matplotlib画图 gridlayout 删除画布

最近用pyqt5写一个项目,删除gridLayout布局中的控件时,发现单单用self.gridLayout.remove(i),i 为控件,发现控件并没有从布局中移除,网上找了好久终于找到了解决办法,这里做一个简单的分享。

在这里插入图片描述

问题描述

整个界面如上图所示。matplotlib画图时候,需要用到MyFigure创建画布,画布与组件(widget或者GroupBox)绑定,打开相应的文件,只能在界面上显示固定的图片,未能实现打开一幅文件,显示相应的图片。

class MyFigure(FigureCanvas):
    def __init__(self, width=10, height=1, dpi=120):
        # 第一步:创建一个创建Figure
        self.fig = Figure(figsize=(width, height), dpi=dpi)
        # 第二步:在父类中激活Figure窗口
        super(MyFigure, self).__init__(self.fig)  # 此句必不可少,否则不能显示图形
self.F = MyFigure(10, 0.5, 80)
self.gridlayout = QGridLayout(self.widget_1)  # 继承容器groupBox
self.gridlayout.addWidget(self.F )

解决办法

看网上大多数说的是:正常调用removeWidget()方法删除控件,但是删不干净,需要调用sip.delete()再删一下才能彻底清除。但实际上在调用sip.delete(),会报一下TypeError: delete() argument 1 must be sip.simplewrapper, not MyFigure
后来找到一些资料说用self.F.deleteLater()能解决问题,但实际上gridlayout已经跟你组件绑定了,下次调用的时候只需要添加 self.gridlayout.addWidget(self.F)

self.gridlayout.removeWidget(self.F)
self.F.deleteLater()

为了让大家能看的清除,小编把l布局函数和清除布局的函数放上。布局函数的plot_count 为计数器。

 def layout_F(self):
        global float_AverageDelay, float_Delay_PRR, F, F1

        self.F = MyFigure(10, 0.5, 80)
        self.F1 = MyFigure(10, 0.5, 80)

        if self.plot_count == 0:
            self.gridlayout = QGridLayout(self.widget_1)  # 继承容器groupBox
            self.gridlayout.addWidget(self.F)
        else:
            self.gridlayout.addWidget(self.F)
    def clear(self):
        self.gridlayout.removeWidget(self.F)
  		self.F.deleteLater()
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
PyQt5是一个流行的Python GUI开发框架,而matplotlib是一个功能强大的绘图库,可以创建各种类型的图形,包括折线图、散点图、条形图等。下面是使用PyQt5matplotlib绘制图形的简单步骤: 1. 安装必要的库:PyQt5matplotlib。 2. 导入必要的模块:`matplotlib.pyplot`和`matplotlib.backends.backend_qt5agg`。 3. 创建`QWidget`对象作为主窗口。 4. 在主窗口中创建一个`QVBoxLayout`对象,用于管理所有子控件的布局。 5. 创建一个`QMainWindow`对象,并将它设置为主窗口的子控件。 6. 创建一个`FigureCanvasQTAgg`对象,并将它添加到`QMainWindow`对象中。 7. 使用`matplotlib.pyplot`模块中的函数创建图形,并将其绘制在`FigureCanvasQTAgg`对象中。 8. 显示主窗口。 以下是一个简单的例子,演示如何使用PyQt5matplotlib绘制一个简单的折线图: ```python import sys import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QVBoxLayout class MyMainWindow(QMainWindow): def __init__(self): super().__init__() # 创建FigureCanvasQTAgg对象 self.canvas = FigureCanvas(plt.Figure()) # 绘制图形 ax = self.canvas.figure.add_subplot(111) ax.plot([1, 2, 3, 4], [1, 4, 2, 3]) # 创建QWidget对象 widget = QWidget() layout = QVBoxLayout(widget) layout.addWidget(self.canvas) # 设置主窗口 self.setCentralWidget(widget) if __name__ == '__main__': app = QApplication(sys.argv) window = MyMainWindow() window.show() sys.exit(app.exec_()) ```
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值