Automatycznie zapisuj skrypty python w QGIS

9

Podczas pisania skryptów Python QGIS nie zapisuje ich, gdy użytkownik zapisuje swój główny projekt za pomocą ctrl+Spolecenia lub Project->Save. Poza tym, opuszczając QGIS, program nie ostrzega o niezapisanych zmianach w skryptach Pythona, nawet jeśli ostrzega o niezapisanych zmianach w projekcie i oferuje ich zapisanie.

Czy jest jakaś opcja zmiany tego zachowania?

Powinienem dodać, że użycie opcji dialogowej do zapisania projektu przy wychodzeniu rzeczywiście zapisuje projekt, ale nie skrypty Pythona. Te są po prostu zagubione.

almerillat
źródło
2
Dobrze, chciałbym mieć ostrzeżenie, zrobiłem też swoje bolesne doświadczenie, gdy przypadkowo zamknąłem i zapisałem projekt, w którym utracono zmiany w skrypcie Pythona ... Nie mam rozwiązania, ale moim obejściem jest użycie zewnętrzny edytor tekstu (używam linku Atom ). To zapisuje twoje zmiany, a Qgis automatycznie przeładuje twój scipt, nawet gdy jest już otwarty ...
ADorsch
3
Jeśli skrypt jest uruchamiany w edytorze konsoli Python , istnieje opcja „Automatycznie zapisuj skrypt przed uruchomieniem”, który działa tak, jak mówi. To nie odpowie na twoje pytanie, ale może pomóc ci zapisać zmiany wprowadzone podczas uruchamiania skryptów.
Joseph

Odpowiedzi:

4

Jeśli chcesz zapisać bieżący skrypt Pythona w Edytorze Python za każdym razem, gdy zapisujesz projekt, wpisz następujące polecenie w konsoli:

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

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

To w zasadzie łączy projectSaved () sygnał do saveScriptFile () funkcji w konsoli Pythona.


Kredyt do Germán Carrillo na jego odpowiedź w tym wątku , w którym powyższa odpowiedź była oparta na.



Edytować:

Jedną z metod automatycznego zapisywania wszystkich skryptów jest nieznaczna modyfikacja pliku console.py przetwarzania , który można znaleźć w katalogu QGIS. Na przykład:

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

Znajdź def saveScriptFile(self):funkcję i zastąp pierwszy wiersz:

tabWidget = self.tabEditorWidget.currentWidget()

z następującymi i wcięcie wszystkiego po:

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

Aby wyglądało to tak:

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)

Zapisz plik.

Teraz musimy utworzyć plik startup.py w twoim /.qgis2/python/katalogu, ten plik jest ładowany podczas uruchamiania QGIS, aby mógł uruchomić dowolny kod zapisany w nim. Dołącz następujący kod:

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)

Zapisz plik.

Mam nadzieję, że teraz, gdy załadujesz QGIS i zapiszesz projekt, wszystkie otwarte skrypty w edytorze konsoli powinny zostać zapisane.


(Uwaga: jestem pewien, że możesz iterować przez otwarte skrypty w edytorze konsoli, ale jeszcze go nie znalazłem. Byłaby to znacznie lepsza i mniej inwazyjna metoda, ponieważ pozwala uniknąć zmiany kodu źródłowego).

Joseph
źródło
1
Fajny kod wskazujący na odpowiedź. Zapisuje to jednak tylko bieżący skrypt Pythona w Edytorze Python (jak już powiedziałeś), ale inne skrypty nie są zapisywane ... Poza tym zachowanie to zostaje utracone po zamknięciu QGIS. Nadal daje ci głos za dobrą odpowiedź =)
almerillat
@almerillat - Dzięki, edytowałem post, aby uwzględnić możliwą metodę :)
Joseph
1
Wow, imponujące. Działa to jak urok, pod warunkiem, że wcinasz spacje, a nie tabulatory (jak myliłem się). Dopóki nie będzie dostępne lepsze rozwiązanie, zaakceptuję je. Dziękuję Ci !
almerillat
@almerillat Serdecznie witamy, cieszę się, że zadziałało! Tak, mam nadzieję, że zostanie opublikowane lepsze rozwiązanie :)
Joseph