Автоматично зберігати сценарії python у QGIS


9

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

Чи є варіант змінити таку поведінку?

Варто додати, що використання параметра діалогу для збереження проекту при виході дійсно зберігає проект, але не сценарії python. Це просто втрачено.


2
Хороший момент, було б добре мати попередження, я теж зробив свій болісний досвід, коли випадково закрив і врятував проект, де змінилися сценарії зміни пітона ... У мене немає рішення, але моє вирішення - використовувати зовнішній текстовий редактор (я використовую посилання 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 () функції в консолі пітона.


Кредит Germán Каррільо його відповіді на цей пост , в якому вище відповідь був заснований.



Редагувати:

Один із способів автоматичного збереження всіх сценаріїв - це трохи змінити файл обробки 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 Ласкаво просимо, радий, що це працювало! Так, сподіваємось, краще рішення буде опубліковане :)
Йосип
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.