QGISにPythonスクリプトを自動的に保存する


9

Pythonスクリプトを作成する場合、ユーザーがctrl+Sコマンドまたはを使用してメインプロジェクトを保存しても、QGISはそれらを保存しませんProject->Save。さらに、QGISを終了するときに、プロジェクトへの未保存の変更について警告し、それらを保存するように提案しても、プログラムはPythonスクリプトの未保存の変更について警告しません。

この動作を変更するオプションはありますか?

終了時にプロジェクトを保存するためにダイアログオプションを使用してそれを追加する必要がありますが、実際にはpythonスクリプトは保存されません。それらは単に失われます。


2
良い点、警告があればいいのですが、Pythonスクリプトの変更が失われたプロジェクトを誤って閉じて保存したときも、私は苦痛な経験をしました...私には解決策がありませんが、私の回避策は使用することです外部テキストエディター(私はAtom リンクを使用しています)。これにより変更が保存され、Qgisは既に開いている場合でもsciptを自動的にリロードします...
ADorsch

3
Python Console Editorでスクリプトを実行している場合、「実行前にスクリプトを自動保存するというオプションがあります。これは質問の答えにはなりませんが、スクリプトの実行時に加えた変更を保存するのに役立つ場合があります。
ジョセフ

回答:


4

プロジェクトを保存するたびに現在のPythonスクリプトをPython Editorに保存する場合は、コンソールに次のように入力します。

from PyQt4.QtGui import QDockWidget
def save_project():
    consoleWidget = iface.mainWindow().findChild( QDockWidget, 'PythonConsole' )
    consoleWidget.console.saveScriptFile()

QgsProject.instance().projectSaved.connect(save_project)

これは基本的に、projectSaved()信号をPythonコンソールのsaveScriptFile()関数に接続します。


上記の回答の根拠となったこの投稿での彼の回答はGermánCarrilloの功績によるものです。



編集:

すべてのスクリプトを自動的に保存する 1つの方法は、QGISディレクトリにある処理console.pyファイルをわずかに変更することです。例えば:

C:/Program Files/QGIS 2.18/apps/qgis/python/console/console.py

def saveScriptFile(self):関数を見つけて、最初の行を置き換えます。

tabWidget = self.tabEditorWidget.currentWidget()

次のようにして、その後すべてをインデントします:

for i in range(self.tabEditorWidget.count()):
    tabWidget = self.tabEditorWidget.widget(i)

したがって、次のようになります。

def saveScriptFile(self):
    for i in range(self.tabEditorWidget.count()):
        tabWidget = self.tabEditorWidget.widget(i)
        try:
            tabWidget.save()
        except (IOError, OSError) as error:
            msgText = QCoreApplication.translate('PythonConsole',
                                                 'The file <b>{0}</b> could not be saved. Error: {1}').format(tabWidget.path,
                                                                                                              error.strerror)
            self.callWidgetMessageBarEditor(msgText, 2, False)

ファイルを保存します。

次に、startup.pyファイルを/.qgis2/python/ディレクトリに作成する必要があります。このファイルは、QGISの起動時に読み込まれ、内部に保存されているコードを実行します。次のコードを含めます。

from qgis.core import QgsProject
from qgis.utils import iface
from PyQt4.QtGui import QDockWidget
def save_project():
    consoleWidget = iface.mainWindow().findChild( QDockWidget, 'PythonConsole' )
    consoleWidget.console.saveScriptFile()

QgsProject.instance().projectSaved.connect(save_project)

ファイルを保存します。

うまくいけば、QGISをロードしてプロジェクトを保存するときに、コンソールエディターで開いているすべてのスクリプトを保存する必要があります。


(注:コンソールエディターで開いているスクリプトを繰り返し処理できることは確かですが、まだ見つかりません。これは、ソースコードの変更を回避できるので、はるかに優れた、煩わしくない方法です。)


1
答えを示唆する素敵なコード。ただし、これは現在の pythonスクリプトをPython Editorに保存するだけです(あなたが言ったように)が、他のスクリプトは保存されません...さらに、この動作はQGISを閉じると失われます。それでも良い答えに
賛成==

@almerillat-ありがとう、私は可能な方法を含むように投稿を編集しました:)
Joseph

1
すごい、印象的。タブではなくスペースでインデントしている限り、これは魅力のように機能します(私が誤って行ったように)。より良い解決策がない限り、私はそれを受け入れます。ありがとうございました !
almerillat 2017年

@almerillat大歓迎です。はい、うまくいけばより良い解決策が投稿されます:)
ジョセフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.