บันทึกสคริปต์หลามโดยอัตโนมัติใน QGIS


9

เมื่อมีการเขียนสคริปต์หลาม QGIS ไม่ได้บันทึกไว้เมื่อผู้ใช้บันทึกโครงการหลักของเขากับคำสั่งหรือctrl+S Project->Saveนอกจากนี้เมื่อออกจาก QGIS โปรแกรมจะไม่เตือนเกี่ยวกับการเปลี่ยนแปลงที่ไม่ได้บันทึกไว้ในสคริปต์หลามแม้ว่ามันจะเตือนเกี่ยวกับการเปลี่ยนแปลงที่ไม่ได้บันทึกไว้ในโครงการและข้อเสนอเพื่อบันทึก

มีตัวเลือกในการเปลี่ยนแปลงพฤติกรรมนี้หรือไม่?

ฉันควรจะเพิ่มสิ่งนั้นโดยใช้ตัวเลือกการเจรจาเพื่อบันทึกโครงการเมื่อเลิกจริง ๆ แล้วบันทึกโครงการ แต่ไม่ใช่สคริปต์งูหลาม สิ่งเหล่านั้นจะหายไป


2
จุดดีน่าจะดีที่ได้รับคำเตือนฉันทำประสบการณ์ที่เจ็บปวดของฉันเช่นกันเมื่อฉันเผลอปิดและบันทึกโครงการซึ่งการเปลี่ยนแปลงสคริปต์หลามหายไป ... ฉันไม่มีทางออก แต่วิธีแก้ปัญหาของฉันคือการใช้ โปรแกรมแก้ไขข้อความภายนอก (ฉันใช้ลิงค์ Atom ) สิ่งนี้จะบันทึกการเปลี่ยนแปลงของคุณและ Qgis จะโหลด scipt ของคุณอีกครั้งโดยอัตโนมัติแม้ในขณะที่เปิดอยู่แล้ว ...
Adorsch

3
หากคุณใช้งานสคริปต์ของคุณในPython Console Editorจะมีตัวเลือก"บันทึกสคริปต์อัตโนมัติก่อนใช้งาน"ซึ่งเป็นไปตามที่ระบุไว้ สิ่งนี้จะไม่ตอบคำถามของคุณ แต่อาจช่วยให้คุณบันทึกการเปลี่ยนแปลงที่คุณทำเมื่อเรียกใช้สคริปต์
Joseph

คำตอบ:


4

หากคุณต้องการบันทึกสคริปต์ python ปัจจุบันในPython Editorทุกครั้งที่คุณบันทึกโครงการของคุณให้พิมพ์ดังต่อไปนี้ในคอนโซล:

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 Carrilloสำหรับคำตอบของเขาในโพสต์นี้ซึ่งคำตอบข้างต้นเป็นไปตาม



แก้ไข:

วิธีหนึ่งในการบันทึกสคริปต์ทั้งหมดโดยอัตโนมัติคือแก้ไขไฟล์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 Editor (ตามที่คุณพูด) แต่สคริปต์อื่นไม่ได้ถูกบันทึก ... นอกจากนี้พฤติกรรมนี้จะหายไปเมื่อปิด QGIS ยังคงให้คุณ upvote สำหรับคำตอบที่ดี =)
almerillat

@almerillat - ขอบคุณฉันได้แก้ไขโพสต์ที่จะรวมถึงวิธีการที่เป็นไปได้ :)
โจเซฟ

1
ว้าวน่าประทับใจ มันใช้งานได้อย่างมีเสน่ห์ตราบใดที่คุณเยื้องพื้นที่และไม่แท็บ (อย่างที่ฉันทำผิด) ตราบใดที่ยังไม่มีวิธีแก้ปัญหาที่ดีกว่านี้ฉันจะยอมรับมัน ขอบคุณ !
almerillat

@almerillat ยินดีต้อนรับมากที่สุดดีใจที่มันทำงานได้! ใช่หวังว่าจะมีการแก้ปัญหาที่ดีกว่า :)
โจเซฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.