0

Python で GTK を使用しています。SAVE AS は簡単ですが、何らかの理由でファイルを SAVE できないことに気付きました。保存されたかどうかを確認してから保存するように設定したと思いましたが、何らかの理由で、ファイル名の値を保存せずに関数を何度も再起動します。私を殺しているのは、これが初心者の間違いのように感じられることです. どういうわけか、関数が実行された後に値を保持するのを忘れていました。これが理にかなっていることを願っています。

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
4

1 に答える 1

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-branchとelif-branchでは、

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

これを別のメソッドに入れます。ファイルの書き込みを変更する場合は、このコードスニペットの2番目のオカレンスを変更することを忘れることをお約束します。

于 2013-01-17T07:22:55.003 に答える