python gtk сохранить gtksourceview

Я работаю с GTK в Python. Я заметил, что легко СОХРАНИТЬ КАК, но по какой-то причине я не могу просто СОХРАНИТЬ файл. Я думал, что настроил его, чтобы проверить, был ли он вообще сохранен, а затем СОХРАНИТЬ, но по какой-то причине он перезапускает функцию снова и снова без сохранения значения имени файла. Меня убивает то, что это похоже на ошибку новичка. как-то я забыл сохранить значение после запуска функции. Я надеюсь это имеет смысл.

def SaveFile(filename):
    chooser = gtk.FileChooserDialog("Save File...", None,
                                    gtk.FILE_CHOOSER_ACTION_SAVE,
                                    (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, 
                                     gtk.STOCK_SAVE, gtk.RESPONSE_OK))

    filename = chooser.get_filename()
    if filename == None:
        response = chooser.run()
        if response == gtk.RESPONSE_OK:
            filename = chooser.get_filename()
            chooser.destroy()
            wbuffer = textview.get_buffer()
            text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter())
            openfile = open(filename,"w")
            openfile.write(text)
            openfile.close()
            print filename, "this is the first part"
            return filename
        else:
            chooser.destroy()
    elif filename != None:
        wbuffer = textview.get_buffer()
        text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter())
        openfile = open(filename,"w")
        openfile.write(text)
        openfile.close()
        print filename, "made it this far"
        return filename
    else:
        chooser.destroy()
        return filename

person LUser    schedule 17.01.2013    source источник
comment
Ваш отступ кода был полностью перепутан и поэтому трудно читался. Вы смешали вкладки и пробелы. Используйте PEP 8 и используйте отступ в 4 пробела. Не могли бы вы убедиться, что я не изменил поток вашего кода своим редактированием?   -  person Thorsten Kranz    schedule 17.01.2013


Ответы (1)


Насколько я могу судить, вы никак не сохраняете свое имя файла между вызовами. Вы вызываете filename = chooser.get_filename() во вновь созданном FileChooseDialog — это всегда будет возвращать None.

Поскольку я не знаю больше об архитектуре вашей программы, я могу просто предложить использовать глобальную переменную для сохранения имени файла, например:

filename = None

def SaveFile(filename):
    global filename
    if filename == None:
        chooser = gtk.FileChooserDialog("Save File...", None,
                                    gtk.FILE_CHOOSER_ACTION_SAVE,
                                    (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, 
                                     gtk.STOCK_SAVE, gtk.RESPONSE_OK))
        response = chooser.run()
        if response == gtk.RESPONSE_OK:
            filename = chooser.get_filename()
            chooser.destroy()
            wbuffer = textview.get_buffer()
            text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter())
            openfile = open(filename,"w")
            openfile.write(text)
            openfile.close()
            print filename, "this is the first part"
            return filename
        else:
            chooser.destroy()
    elif filename != None:
        wbuffer = textview.get_buffer()
        text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter())
        openfile = open(filename,"w")
        openfile.write(text)
        openfile.close()
        print filename, "made it this far"
        return filename
    else:
        chooser.destroy()
        return filename

Но помните, изменение глобальных переменных всегда опасно, возможно, вы придумаете лучший подход. Если вы поместите свой метод в класс, вы можете сделать filename атрибутом этого класса, например, self._filename.

Еще одно замечание: никогда не дублируйте код. В if-ветви и в elif-ветви вы вызываете

        wbuffer = textview.get_buffer()
        text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter())
        openfile = open(filename,"w")
        openfile.write(text)
        openfile.close()

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

person Thorsten Kranz    schedule 17.01.2013
comment
Сделать их глобальными удалось. Вы правы, что классы должны работать и продолжать получать ценность от класса. Если кто-то планирует сделать его глобальным. Я попал в точку, чтобы сохранить без необходимости открывать файл, и мне просто нужно было исключить NameError: и вызвать функцию SaveAs. Надеюсь, это поможет следующему человеку в будущем. Спасибо, Торстен Кранц. - person LUser; 20.01.2013