Автоматически сохранять скрипты Python в QGIS

9

При написании скриптов на Python QGIS не сохраняет их, когда пользователь сохраняет свой основной проект с помощью ctrl+Sкоманды или Project->Save. Кроме того, при выходе из QGIS программа не предупреждает о несохраненных изменениях в скриптах Python, даже если предупреждает о несохраненных изменениях в проекте и предлагает их сохранить.

Есть ли возможность изменить это поведение?

Я должен добавить, что использование опции диалога для сохранения проекта при выходе действительно сохраняет проект, но не скрипты Python. Те просто потеряны.

almerillat
источник
2
Хороший вопрос, было бы неплохо получить предупреждение, я тоже испытал боль, когда случайно закрыл и сохранил проект, в котором были потеряны изменения скрипта Python ... У меня нет решения, но мой обходной путь должен использовать внешний текстовый редактор (я использую ссылку Atom ). Это сохранит ваши изменения, и Qgis автоматически перезагрузит ваш текст, даже если он уже открыт ...
ADorsch
3
Если вы запускаете свой скрипт в редакторе консоли Python , есть опция «Автосохранение скрипта перед запуском», которая делает то, что говорит. Это не ответит на ваш вопрос, но может помочь вам сохранить изменения, внесенные при запуске сценариев.
Иосиф

Ответы:

4

Если вы хотите сохранять текущий скрипт Python в редакторе Python каждый раз, когда сохраняете свой проект, введите в консоль следующее:

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

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

Это по существу соединяет projectSaved () сигнал на saveScriptFile () функции в консоли питона.


Благодарим Германа Каррильо за его ответ в этом посте, на котором был основан ответ выше.



Редактировать:

Один из способов автоматического сохранения всех сценариев - это немного изменить ваш файл console.py для обработки, который находится в вашем каталоге QGIS. Например:

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 (как вы сказали), но другие скрипты не сохраняются ... Кроме того, это поведение теряется при закрытии QGIS. Все еще даю вам голос за хороший ответ =)
almerillat
@almerillat - Спасибо, я отредактировал пост, чтобы включить возможный метод :)
Джозеф
1
Вау, впечатляет. Это работает как шарм, если вы делаете отступы, а не табуляции (как я ошибочно сделал). Пока нет лучшего решения, я его приму. Спасибо !
almerillat
@almerillat Добро пожаловать, рад, что это сработало! Да, надеюсь, будет опубликовано лучшее решение :)
Джозеф