Сохранить как объект ошибки «X» не имеет атрибута «Y» в плагине QGIS

Я пытаюсь сделать так, чтобы плагин открывался, читался, а затем сохранялся в другом формате, я открываю файл .xml и пытаюсь сохранить как/записать его в текстовом или pdf-формате, но получаю сообщение об ошибке, подобное этому:

File "C:\Users\Mr.Pakde/.qgis2/python/plugins\latih\latihdialog.py", line 71, in saveAs
    self._save( _filename )
  File "C:\Users\Mr.Pakde/.qgis2/python/plugins\latih\latihdialog.py", line 59, in _save
    f.write( "%s" % self.nmfile.text() )
AttributeError: 'latihDialog' object has no attribute 'nmfile'

это мой код

cariButton = self.ui.btnCari
        QtCore.QObject.connect(cariButton, QtCore.SIGNAL('clicked()'),self.cari)
        saveButton = self.ui.btnSave
        QtCore.QObject.connect(saveButton, QtCore.SIGNAL('clicked()'),self.saveAs)

    def cari(self, event=None):

        #open dialog
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open File', '*.xml')

        self.ui.lineFile.setText(filename)

        #panggil isi data
        self.isiDataFile(filename)

    def isiDataFile(self, nmfile):
        #buka dengan open mode baca
        teksFile = open(nmfile, 'r').read()

        self.ui.textFile.setText(teksFile)


    def _save(self, simpan):        
        f = open( simpan, "w" )
        f.write( "%s" % self.nmfile.text() )
        f.close()
    def savefile(self):
        if self.simpan:
              self._save( "%s" % self.simpan )
        else:
              self.saveAs()

    def saveAs(self):
            tulis = QtGui.QFileDialog(self).getSaveFileName()
            if tulis !="":
                _filename = "%s" % tulis
                self._save( _filename )
                self.setFilename( _filename )

person user3044923    schedule 27.12.2013    source источник


Ответы (1)


Вы пытаетесь использовать переменную nmfile в качестве переменной экземпляра, обращаясь к ней способом self.nmfile. Однако эта переменная/атрибут никогда не была инициализирована (сравните: AttributeError: объект 'latihDialog' не имеет атрибута 'nmfile').

Вы используете переменную в локальном контексте в isiDataFile, но как только этот метод завершается, локальная переменная теряется и становится недоступной.

Вы должны спроектировать поток своего кода так, чтобы он либо

  • Назначьте эту переменную экземпляра перед вызовом метода _save (например, self.nmfile = '/tmp/myfile' )
  • Передайте аргумент nmfile методу _save, чтобы он был доступен там
person Matthias Kuhn    schedule 27.12.2013