PyQt5中Matplotlib导航栏弃用self.parent后访问画布figure问题问询
问题原因
Matplotlib 3.3+ 已将NavigationToolbar内置的parent属性标记为弃用,任何直接读写self.parent的操作都会触发告警,且你原代码中通过父控件间接获取画布对象的逻辑完全冗余,导航工具栏实例本身就自带绑定的画布属性。
修复方案
核心修改:替换save_figure方法中获取figure的逻辑
你不需要通过parent绕层获取画布,NavigationToolbar初始化时就会将传入的figure_canvas自动绑定到self.canvas属性,直接读取即可:
def save_figure(self): # 直接从当前工具栏绑定的画布获取figure,完全不触发告警 fig = self.canvas.figure # 也可以用你自己存的 self.MyCanvas.figure,效果完全一致 # fig = self.MyCanvas.figure files_types = 'Image (*bmp);Image (*.tif); Image (*.png); Image (*jpeg)' fileName, _ = qtw.QFileDialog.getSaveFileName(self, 'Save File', '', files_types) if fileName == '': return else: fig.savefig(fileName, bbox_inches='tight', dpi = 300)
可选优化:如果后续需要用到parent对象
如果其他业务逻辑需要访问父控件,不要用内置的self.parent,你可以在__init__中自定义一个属性存储parent,避免和弃用属性重名:
def __init__(self, figure_canvas, parent = None): # ... 原有代码不变 self.canvas.setParent(parent) # 自定义属性存parent,不会触发告警 self._parent = parent self.MyCanvas = figure_canvas
后续需要用到父控件的地方直接调用self._parent即可。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

