Python komut dosyalarını QGIS'ye otomatik olarak kaydet


9

Python komut dosyaları yazarken, kullanıcı ana projesini ctrl+Skomutla veya ile kaydettiğinde QGIS bunları kaydetmez Project->Save. Ayrıca, QGIS'den ayrılırken, program projede kaydedilmemiş değişiklikler hakkında uyarsa ve bunları kaydetmeyi teklif etse bile , python komut dosyalarındaki kaydedilmemiş değişiklikler hakkında uyarmaz.

Bu davranışı değiştirmek için herhangi bir seçenek var mı?

Ben çıkarken projeyi kaydetmek için diyalog seçeneğini kullanarak bunu gerçekten proje kaydetmek, ancak python komut dosyaları değil eklemeliyim. Bunlar basitçe kaybolur.


2
İyi bir nokta, bir uyarıya sahip olmak güzel olurdu, projeyi yanlışlıkla kapatıp python komut dosyası değişikliklerinin kaybolduğu projeyi kaydettiğimde de acı verici deneyimimi yaptım ... Bir çözümüm yok, ancak geçici çözümüm harici bir metin düzenleyici (Atom bağlantısını kullanıyorum ). Bu, değişikliklerinizi kaydeder ve Qgis, zaten açık olsa bile, scipt'inizi otomatik olarak yeniden yükler ...
ADorsch

3
Komut dosyanızı Python Konsol Düzenleyicisi'nde çalıştırıyorsanız , söylediği gibi "Komut dosyasını çalıştırmadan önce otomatik kaydet" seçeneği vardır . Bu, sorunuza cevap vermez, ancak komut dosyalarını çalıştırırken yaptığınız değişiklikleri kaydetmenize yardımcı olabilir.
Joseph

Yanıtlar:


4

Projenizi her kaydettiğinizde geçerli python komut dosyasını Python Düzenleyicisi'ne kaydetmek istiyorsanız, konsola aşağıdakileri yazın:

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

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

Bu aslında projectSaved () sinyalini python konsolundaki saveScriptFile () işlevine bağlar .


Yukarıdaki cevabın dayandığı bu yazıdaki cevabı için Germán Carrillo'a teşekkür ederiz .



Düzenle:

Tüm komut dosyalarını otomatik olarak kaydetmenin bir yolu , QGIS dizininizde bulunan işleme konsolu.py dosyanızı biraz değiştirmektir . Örneğin:

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

def saveScriptFile(self):İşlevi bulun ve ilk satırı değiştirin:

tabWidget = self.tabEditorWidget.currentWidget()

aşağıdaki ile ve sonra her şeyi girinti:

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

Böylece şöyle görünür:

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)

Dosya 'yı kaydet.

Şimdi dizininizde bir startup.py dosyası oluşturmamız gerekiyor /.qgis2/python/, bu dosya QGIS başlatıldığında yüklenir, böylece içine kaydedilmiş herhangi bir kodu çalıştırır. Aşağıdaki kodu ekleyin:

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)

Dosya 'yı kaydet.

Şimdi, umarım, QGIS yükleyip bir projeyi kaydettiğinizde, konsol düzenleyicide açılan tüm komut dosyaları kaydedilmelidir.


(Not: Konsol düzenleyicide açılan komut dosyalarını yineleyebileceğinizden eminim ama henüz bulamadım. Bu, kaynak kodunu değiştirmekten kaçındığı için çok daha iyi ve daha az müdahaleci bir yöntem olacaktır.)


1
Bir cevap doğru ipuçları güzel kod. Ancak, bu yalnızca geçerli python komut dosyasını Python Düzenleyicisi'ne kaydeder (dediğiniz gibi), ancak diğer komut dosyaları kaydedilmez ... Ayrıca, QGIS kapatıldıktan sonra bu davranış kaybolur. Hala güzel cevap için bir upvote =)
almerillat

@almerillat - Teşekkürler, olası bir yöntem eklemek için gönderiyi düzenledim :)
Joseph

1
Vay etkileyici. (Yanlışlıkla yaptığım gibi) değil sekmelerle girintili sürece bu bir cazibe gibi çalışır. Daha iyi bir çözüm olmadığı sürece kabul edeceğim. Teşekkür ederim !
almerillat

@almerillat En hoş geldiniz, işe yaradığı için memnunum! Evet, umarım daha iyi bir çözüm gönderilecektir :)
Joseph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.