2 votos

NameError: name 'QgsApplication' is not defined in python standalone script

Tengo este script independiente para mostrar shapefile. He seguido el qgis python cookbook procedimiento, pero tengo este error. "NameError: name 'QgsApplication' is not defined". Aquí está todo mi código. Alguien por favor dígame donde estoy equivocado. He verificado mi setPrefixPath ejecutandolo en la consola de Qgis python

from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys, os

class Mapbox(QMainWindow):    
    def __init__(self, shapefile):
        QMainWindow.__init__(self)
        self.setWindowTitle("Map Box Viewer")
        canvas = QgsMapCanvas()
        canvas.useImageToRender(False)
        canvas.setCanvasColor(Qt.white)
        canvas.show()

        layer = QgsVectorLayer(shapefile, "layer1", "ogr")
        if not layer.isValid():
            raise IOError("Invalid shapefile")

        QgsMapLayerRegistry.instance().addMapLayer(layer)
        canvas.setExtent(layer.extent())
        canvas.setLayerSet([QgsMapCanvasLayer(layer)])        
        self.setCentralWidget(canvas)

app = QApplication(sys.argv)        
QgsApplication.setPrefixPath("C:\OSGeo4W64\apps\qgis", True)        
QgsApplication.initQgis()        
viewer = Mapbox(r"shapefile.shp")        
viewer.show()

app.exec_()        
QgsApplication.exitQgis()

0voto

anisoptera Puntos 330

Te falta la sentencia import para el archivo QgsApplication Añadir from qgis.core import QgsApplication . Esto puede darle una ImportError si su qgis.core no está en sus variables de entorno, el proceso para solucionar esto varía dependiendo de su sistema operativo

También, QgsApplication es una subclase de QApplication por lo que no es necesario utilizar ambos. Esto es lo que puedes hacer:

from PyQt4.QtGui import *
from PyQt4.QtCore import *
from qgis.core import QgsApplication, QgsMapCanvas, QgsVectorLayer, QgsMapLayerRegistry, QgsMapCanvasLayer
import sys, os

class Mapbox(QMainWindow):    
    def __init__(self, shapefile):
        QMainWindow.__init__(self)
        self.setWindowTitle("Map Box Viewer")
        canvas = QgsMapCanvas()
        canvas.useImageToRender(False)
        canvas.setCanvasColor(Qt.white)
        canvas.show()

        layer = QgsVectorLayer(shapefile, "layer1", "ogr")
        if not layer.isValid():
            raise IOError("Invalid shapefile")

        QgsMapLayerRegistry.instance().addMapLayer(layer)
        canvas.setExtent(layer.extent())
        canvas.setLayerSet([QgsMapCanvasLayer(layer)])        
        self.setCentralWidget(canvas)

app = QgsApplication(sys.argv, True)  # the second arg "True", says that you are using a interface
app.setPrefixPath("C:/OSGeo4W64/apps/qgis", True)  # Use forward slash in paths or os.path
app.initQgis()        
viewer = Mapbox(os.path.abspath("shapefile.shp"))  # QgsVectorLayer needs the absolute path to create a valid layer
viewer.show()

app.exec_()        
app.exit()

He añadido algunos cambios menores en el código.

Nota al margen: QGis y PyQt son cosas diferentes, PyQt es una api de python de Qt . Se utiliza para crear interfaces, QGis hace uso de PyQt para hacer sus interfaces

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X