2016-11-18 179 views
1

我嘗試在qgis中製作插件,並且遇到問題。 當我把代碼放到蟒蛇控制檯下的插件這個工程:Qgis:IndexError:列表索引超出範圍

def Style_for_layer(): 
    layer = qgis.utils.iface.legendInterface().layers()[0] 
    if layer.type() == QgsMapLayer.VectorLayer and layer.geometryType() == QGis.Point and layer.name() in ["one","two"]: 
     layer.loadNamedStyle('C:/Users/user/Desktop/style_one.qml') 
    elif layer.type() == QgsMapLayer.VectorLayer and layer.geometryType() == QGis.Line and layer.name() == "some name layer": 
    layer.loadNamedStyle('C:/Users/user/Desktop/style_two.qml') 
    else: 
      pass 
    legend = qgis.utils.iface.legendInterface() 
    legend.itemAdded.connect(Style_for_layer) 

對方當​​我通過maked插件「插件buildier」這不行:

def run(self): 
     """Run method that performs all the real work""" 
     # show the dialog 
     #self.dlg.show() 
     # Run the dialog event loop 
     #result = self.dlg.exec_() 
     # See if OK was pressed 
     #if result: 
    layer = qgis.utils.iface.legendInterface().layers()[0] 
    if layer.type() == QgsMapLayer.VectorLayer and layer.geometryType() == QGis.Point and layer.name() in ["one","two"]: 
      layer.loadNamedStyle('C:/Users/user/Desktop/style_one.qml') 
    elif layer.type() == QgsMapLayer.VectorLayer and layer.geometryType() == QGis.Line and layer.name() == "some name layer": 
      layer.loadNamedStyle('C:/Users/user/Desktop/style_two.qml') 
    else: 
     pass  
    legend = qgis.utils.iface.legendInterface() 
    legend.itemAdded.connect(run) 

然後當我嘗試使用插件:

IndexError: list index out of range 

爲什麼在控制檯它工作,但不能在插件工作?

回答

1

只要找什麼回報qgis.utils.iface.legentInterface().layers()

如果你在插件中,這不是訪問iface的方式,因爲它在插件初始化時作爲參數傳遞。

無論如何,legendInterface已被棄用,您應該使用圖層註冊表來執行此操作。

QgsMapLayerRegistry.instance().mapLayers()將返回所有圖層的字典或mapLayer(my_layer_id)將返回適當的圖層。