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()