Tự động lưu tập lệnh python trong QGIS


9

Khi viết tập lệnh python, QGIS không lưu chúng khi người dùng lưu dự án chính của mình bằng ctrl+Slệnh hoặc bằng Project->Save. Bên cạnh đó, khi rời QGIS, chương trình không cảnh báo về những thay đổi chưa được lưu trong tập lệnh python ngay cả khi nó cảnh báo về những thay đổi chưa được lưu đối với dự án và đề nghị lưu chúng.

Có bất kỳ lựa chọn để thay đổi hành vi này?

Tôi nên thêm rằng sử dụng tùy chọn hội thoại để lưu dự án khi thoát thực sự lưu dự án, nhưng không phải là các kịch bản python. Những điều đó chỉ đơn giản là bị mất.


2
Điểm hay, sẽ rất hay khi có cảnh báo, tôi cũng đã trải nghiệm đau đớn, khi tôi vô tình đóng và lưu dự án, nơi thay đổi kịch bản python bị mất ... Tôi không có giải pháp, nhưng cách giải quyết của tôi là sử dụng một trình soạn thảo văn bản bên ngoài (Tôi đang sử dụng liên kết Atom ). Điều này sẽ lưu các thay đổi của bạn và Qgis sẽ tự động tải lại scipt của bạn, ngay cả khi đã mở ...
ADorsch

3
Nếu bạn đang chạy tập lệnh của mình trong Trình điều khiển Python Console , có một tùy chọn "Tự động lưu tập lệnh trước khi chạy" , như đã nói. Điều này sẽ không trả lời câu hỏi của bạn nhưng có thể giúp bạn lưu các thay đổi bạn thực hiện khi chạy tập lệnh.
Joseph

Câu trả lời:


4

Nếu bạn muốn lưu tập lệnh python hiện tại trong Python Editor mỗi khi bạn lưu dự án của mình, hãy nhập đoạn mã sau vào bảng điều khiển:

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

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

Điều này chủ yếu nối liền projectSaved () tín hiệu đến saveScriptFile () chức năng trong python console.


Tín dụng cho Germán Carrillo cho câu trả lời của mình trong bài đăng này, trong đó câu trả lời trên được dựa trên.



Biên tập:

Một phương pháp tự động lưu tất cả các tập lệnh là sửa đổi một chút tệp xử lý console của bạn có thể tìm thấy trong thư mục QGIS của bạn. Ví dụ:

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

Tìm def saveScriptFile(self):hàm và thay thế dòng đầu tiên:

tabWidget = self.tabEditorWidget.currentWidget()

với những điều sau đây và thụt lề mọi thứ sau:

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

Vì vậy, nó trông giống như:

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)

Lưu các tập tin.

Bây giờ chúng tôi cần tạo một tệp startup.txt trong /.qgis2/python/thư mục của bạn , tệp này được tải khi QGIS khởi động để nó sẽ chạy bất kỳ mã nào được lưu bên trong. Bao gồm các mã sau đây:

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)

Lưu các tập tin.

Bây giờ, hy vọng, khi bạn tải QGIS và lưu dự án, tất cả các tập lệnh đã mở trong trình chỉnh sửa bảng điều khiển sẽ được lưu.


(Lưu ý: Tôi khá chắc chắn rằng bạn có thể lặp qua các tập lệnh đã mở trong trình chỉnh sửa bảng điều khiển nhưng vẫn chưa tìm thấy. Đây sẽ là một phương pháp tốt hơn và ít xâm phạm hơn vì nó tránh thay đổi mã nguồn.)


1
Mã đẹp mà gợi ý cho một câu trả lời. Tuy nhiên, điều này chỉ lưu tập lệnh python hiện tại trong Python Editor (như bạn đã nói), nhưng các tập lệnh khác không được lưu ... Bên cạnh đó, hành vi này bị mất khi đóng QGIS. Vẫn cung cấp cho bạn một upvote cho câu trả lời hay =)
almerillat

@almerillat - Cảm ơn, tôi đã chỉnh sửa bài đăng để đưa vào một phương pháp khả thi :)
Joseph

1
Ồ thật ấn tượng. Điều này hoạt động như một sự quyến rũ miễn là bạn thụt vào không gian và không phải các tab (như tôi đã làm sai). Miễn là không có giải pháp tốt hơn, tôi sẽ chấp nhận nó. Cảm ơn bạn !
almerillat

@almerillat Chào mừng bạn, rất vui vì nó hoạt động! Vâng, hy vọng một giải pháp tốt hơn sẽ được đăng :)
Joseph
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.