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

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()

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

Другие вопросы по тегам