2016-06-22 12 views
1

this book called Building Mapping Applications with QGISを購入しましたが、練習問題の1つを試してみようとしています。 Pythonをクラッシュさせて実行しようとするスクリプトがあり、 "python.exeが動作を停止しました"というエラーメッセージが表示されます。QGisのPythonスクリプト - Python.exeが機能しなくなった

import sys 
import os 
from qgis.core import * 
from qgis.gui import * 
from PyQt4.QtGui import * 
from PyQt4.QtCore import Qt 



############################################################################# 


class MapViewer(QMainWindow): 
    def __init__(self, shapefile): 
     QMainWindow.__init__(self) 
     self.setWindowTitle("Map 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)]) 

     layout = QVBoxLayout() 
     layout.addWidget(canvas) 

     contents = QWidget() 
     contents.setLayout(layout) 
     self.setCentralWidget(contents) 

############################################################################# 


def main(): 
    """ Our main program. 
    """ 
    QgsApplication.setPrefixPath(os.environ['QGIS_PREFIX'], True) 
    QgsApplication.initQgis() 

    app = QApplication(sys.argv) 

    viewer = MapViewer("C:/folder/shapefile.shp") 
    viewer.show() 

    app.exec_() 

    QgsApplication.exitQgis() 

############################################################################# 

if __name__ == "__main__": 
    main() 

私はので、私はPythonがクラッシュする原因となっている、あまりにもわからないんだけど、QGISでのPythonについての全体の多くを知りません。パスを定義してOSGeo4Wシェルを使用してスクリプト内のモジュールをインポートすると、エラーメッセージが表示されないため、すべてのモジュールが正しくインポートされているということは肯定的です。

は、これは私のパスが定義されている方法です。このすべてを考えると

SET OSGEO4W_ROOT=C:\OSGeo4W64 
SET QGIS_PREFIX=%OSGEO4W_ROOT%\apps\qgis 
SET PATH=%PATH%;%QGIS_PREFIX%\bin 
SET PYTHONPATH=%QGIS_PREFIX%\python;%PYTHONPATH% 

は、私がスクリプトで何か間違っがなければならないと思います。しかし、http://pep8online.com/を使用してスクリプトをチェックすると、pythonがクラッシュしないように修正できるエラーはありません。

SET PATH=%PATH%;%QGIS_PREFIX%\binの代わりにSET PATH=%QGIS_PREFIX%\bin;%PATH%を試したことに注意してください。

答えて

3

を呼び出す必要はありませんここに:

私は問題が何であるか...もっと深さでこの 読者の問題を見た後、私は何かがを持っていることを発見した知っているかもしれない疑いがありますQGISの新しいバージョンで10が変更され、サンプルコードはもはや が書かれているとおりに動作しなくなりました。技術的には、 は、 への呼び出しを行う前にQApplicationオブジェクトをインスタンス化する必要があると思われます。 は、QgsApplication.initQgisプログラムをクラッシュさせます。 これを修正するには、次のように見えるようにmain()関数を変更:あなたが見ることができるように

def main(): 
    """ Our main program. 
    """ 
    app = QApplication(sys.argv) 
    QgsApplication.setPrefixPath(os.environ['QGIS_PREFIX'],True) 
    QgsApplication.initQgis() 

    viewer = MapViewer("C:/folder/shapefile.shp") 
    viewer.show() 

    app.exec_() 

    QgsApplication.exitQgis() 

、私はに "アプリ=はQApplication(sys.argvの)" の行を移動しましたトップ。

重要な注意:前方スラッシュがviewer = MapViewer("C:/folder/shapefile.shp")に使用されていることを確認します - バックスラッシュを使用すると、シェープファイルが無効であることを示すエラーメッセージが表示されます。

私はまた、上記の修正(質問に対するコメント)のどれも必要ではなかったことに言及する価値があると考えました。次のようにパスが定義されているのであれば、スクリプトは動作します:

SET OSGEO4W_ROOT=C:\OSGeo4W64 
SET QGIS_PREFIX=%OSGEO4W_ROOT%\apps\qgis 
SET PATH=%PATH%;%QGIS_PREFIX%\bin 
SET PYTHONPATH=%QGIS_PREFIX%\python;%PYTHONPATH% 

を次に、スクリプト全体は次のようになります。

import sys 
import os 
from qgis.core import * 
from qgis.gui import * 
from PyQt4.QtGui import * 
from PyQt4.QtCore import Qt 



############################################################################# 


class MapViewer(QMainWindow): 
    def __init__(self, shapefile): 
     QMainWindow.__init__(self) 
     self.setWindowTitle("Map 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)]) 

     layout = QVBoxLayout() 
     layout.addWidget(canvas) 

     contents = QWidget() 
     contents.setLayout(layout) 
     self.setCentralWidget(contents) 

############################################################################# 


def main(): 
    """ Our main program. 
    """ 
    app = QApplication(sys.argv) 
    QgsApplication.setPrefixPath(os.environ['QGIS_PREFIX'],True) 
    QgsApplication.initQgis() 

    viewer = MapViewer("C:/folder/shapefile.shp") 
    viewer.show() 

    app.exec_() 

    QgsApplication.exitQgis() 

############################################################################# 

if __name__ == "__main__": 
    main() 

は、次のコマンドを使用してOSGEO4Wシェルでそれを実行します。

python "C:\script.py"

最後に、この執筆時点では、スクリプトは正常に動作し、参照されたシェイプファイルを表示するビューアを起動しますが、このソリューションで私を提供するための作者エリックWestraへ

ERROR: Opening of authentication db FAILED 
ERROR: Unable to establish authentication database connection 
ERROR: Auth db could not be created and opened 
QSqlDatabasePrivate::database: unable to open database: "unable to open database file Error opening database" 
ERROR: Opening of authentication db FAILED 

ありがとう:問題があると思われないシェルでいくつかのエラーになります。

1

gui要素を親にしないで作成している場合(QgsMapCanvas())、レイアウトに追加する前に手動でshow()を試してみてください。サブウィジェット上でshow()を呼び出す必要はありません。また、すべてのサブウィジェットは、メインウィジェット(または他のサブウィジェットのいずれか)を親とする必要があります。

また、Pythonオブジェクトへの永続的な参照を保存する必要があります。さもなければ、基礎となるC++オブジェクトがガベージコレクションを取得し、プログラムがクラッシュする可能性があります。これを行うには、属性にウィジェットとレイアウトを割り当てて、self

Exに割り当てます。

self.layout = QVBoxLayout(... 
self.layer = ... 
あなたはこのようなキャンバスを追加する必要があります

は、私はので、私は彼の応答を共有する本の著者に連絡を取得するのに十分幸運だった.show()

self.canvas = QgsMapCanvas(self) 
layout.addWidget(self.canvas) 
+0

FYIと同じように、私はこのスクリプトを書いていませんでした。これは、変更せずに動作するはずの本からの直接コピーです。これらの問題を修正するためにスクリプトに加えなければならない複数の変更があるように思えます。私はそれに刺すが、私はどこにも来ていないようだ。あなたが指導のための他のアイデアを持っているなら、私は本当に感謝します。もしあなたがそれを手にしているなら、私は喜んでスクリプトのあなたの修正版を試してみるでしょう! – ge0m3try

関連する問題