QGIS插件PyQt脚本类内跨方法调用变量报错如何解决?
QGIS PyQt 方法拆分变量共享问题解决
报错原因
你修改后仍触发"currLyr" is not defined报错,通常是以下两类问题:
- 代码修改不完整:仅修改了
getLayerInfo内的变量定义,anotherMethod或其他业务逻辑中仍存在调用未加self.前缀的局部变量currLyr的情况 - 属性未提前初始化:
self.currLyr的赋值逻辑被包裹在条件分支内,插件初始化时分支未触发导致实例属性未创建,后续调用就会报错;或是初始化时未选中任何图层,currentLayer()返回空值导致属性赋值失败
修正后完整代码
class CreateSomething(QtWidgets.QDialog, FORM_CLASS): def __init__(self, parent=None): """构造函数""" super(CreateSomething, self).__init__(parent) self.setupUi(self) # 提前初始化图层实例属性,避免未定义报错 self.currLyr = None # 插件首次打开时触发初始化函数 self.getLayerInfo() self.anotherMethod() # 绑定图层变更信号,切换图层时自动更新信息 self.cmbLyrSelect.layerChanged.connect(self.getLayerInfo) # 绑定字段变更信号,切换字段时自动更新信息 self.cmbLyrFields.fieldChanged.connect(self.getLayerInfo) def getLayerInfo(self): # 将当前选中的矢量图层存入实例属性,供所有方法调用 self.currLyr = self.cmbLyrSelect.currentLayer() # 此处保留getLayerInfo的其余业务逻辑 ... def anotherMethod(self): # 增加空值校验,避免无选中图层时触发报错 if self.currLyr: self.lineEdit.setText(self.currLyr.sourceName()) else: self.lineEdit.clear()
逻辑说明
原来的单方法写法可以正常运行,是因为currLyr是getLayerInfo方法内的局部变量,方法内部可直接访问;拆分为多方法后,局部变量无法跨方法调用,必须绑定到self实例上才能实现多方法间的变量共享。提前初始化属性+空值校验的写法可以兼容插件刚启动未选中图层等极端场景,避免意外报错。
内容的提问来源于stack exchange,提问作者BallpenMan
相关产品推荐
相关产品推荐

