Salvar automaticamente scripts python no QGIS

9

Ao escrever scripts python, o QGIS não os salva quando o usuário salva seu projeto principal com o ctrl+Scomando ou com Project->Save. Além disso, ao sair do QGIS, o programa não avisa sobre alterações não salvas nos scripts python, mesmo que avise sobre alterações não salvas no projeto e se oferece para salvá-las.

Existe alguma opção para alterar esse comportamento?

Devo acrescentar que o uso da opção de diálogo para salvar o projeto ao sair realmente salva o projeto, mas não os scripts python. Aqueles estão simplesmente perdidos.

almerillat
fonte
2
Bom ponto, seria bom ter um aviso, fiz também minha experiência dolorosa, quando fechei e salvei acidentalmente o projeto, onde as alterações do script python foram perdidas ... Não tenho uma solução, mas minha solução alternativa é usar um editor de texto externo (estou usando o link Atom ). Isso salva suas alterações e o Qgis recarrega automaticamente seu scipt, mesmo quando já estiver aberto ...
ADorsch
3
Se você estiver executando seu script no Editor de console do Python , existe a opção "Salvar script automaticamente antes de executar", que é o que ele diz. Isso não responderá à sua pergunta, mas poderá ajudá-lo a salvar as alterações feitas ao executar os scripts.
Joseph

Respostas:

4

Se você deseja salvar o script python atual no Editor Python cada vez que salvar seu projeto, digite o seguinte no console:

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

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

Isto essencialmente liga o projectSaved () do sinal para o saveScriptFile () função na consola do pitão.


Agradecemos a Germán Carrillo por sua resposta neste post em que a resposta acima foi baseada.



Editar:

Um método de salvar automaticamente todos os scripts é modificar levemente o arquivo console.py de processamento, que pode ser encontrado no diretório QGIS. Por exemplo:

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

Encontre a def saveScriptFile(self):função e substitua a primeira linha:

tabWidget = self.tabEditorWidget.currentWidget()

com o seguinte e recuar tudo depois:

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

Para que se pareça com:

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)

Salve o arquivo.

Agora, precisamos criar um arquivo startup.py no seu /.qgis2/python/diretório, esse arquivo é carregado quando o QGIS é inicializado, para executar qualquer código salvo dentro dele. Inclua o seguinte código:

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)

Salve o arquivo.

Agora, esperançosamente, quando você carrega o QGIS e salva um projeto, todos os scripts abertos no editor do console devem ser salvos.


(Nota: tenho certeza de que você pode percorrer os scripts abertos no editor do console, mas ainda não o encontrou. Esse seria um método muito melhor e menos invasivo, pois evita alterar o código-fonte.)

Joseph
fonte
11
Código legal que sugere uma resposta. No entanto, isso salva apenas o script python atual no Editor Python (como você disse), mas outros scripts não são salvos ... Além disso, esse comportamento é perdido quando o QGIS é fechado. Ainda dando-lhe um upvote para a resposta agradável =)
almerillat
@almerillat - Obrigado, eu editei o post para incluir um método possível :)
Joseph
11
Uau, impressionante. Isso funciona como um encanto, desde que você recue com espaços e não com guias (como eu fiz por engano). Contanto que nenhuma solução melhor esteja disponível, eu a aceitarei. Obrigado !
Almerillat
@almerillat Muito bem-vindo, feliz que funcionou! Sim, espero que uma solução melhor será postado :)
Joseph