为什么save()第一次写入文件?

时间:2015-10-26 06:31:48

标签: python file tkinter save

我正在编写一个文本编辑器,我正在处理save / save-as按钮,并找到了我最初认为有效但后来发现问题的东西。菜单中的保存和另存为按钮不会将文本小部件中的文本保存到文件中,而只是创建一个。我已经输入了两个函数self.f1.write(text),但只有点击几下才能实际保存文本。这不是时间的事情,因为我等了大约五分钟,但仍然无法正常工作。我在约塞米蒂有一台Mac。

为什么不起作用?

这是脚本:

#modules
from Tkinter import *
from Tkinter import TclError
import tkFont
import tkMessageBox
import tkFileDialog


class Main(object):
    def __init__(self, root):
        root.title("PyText")
        #menu for the file cascade
        self.m1=Menu(root)

        self.appmenu = Menu(self.m1, name="apple", tearoff=0)
        self.m1.add_cascade(menu=self.appmenu)
        self.appmenu.add_command(label="About PyText")
        self.appmenu.add_separator()

        self.fm=Menu(self.m1, tearoff=0)
        self.fm.add_command(label="New", command=self.saveas)
        self.fm.add_command(label="Open", accelerator="Cmd+O", command=self.open)
        #these two don't work first time...
        self.fm.add_command(label="Save", accelerator="Cmd+S", command=self.save)
        self.fm.add_command(label="Save As", command=self.saveas)

        self.fm.add_separator()

        self.fm.add_command(label="Exit", command=root.quit)

        self.m1.add_cascade(label="File", menu=self.fm)

        root.config(menu=self.m1)

        #Main text widget
        self.t1=Text(root)
        self.t1.config(width=90, height=40, undo=True, highlightbackground="black", cursor="ibeam")
        self.t1.grid(row=1)


    # Here is the problem.
    # this command creates the file but does not
    # save the text to the file.
    def saveas(self):
        text = self.t1.get(0.0, END)
        self.savelocation=tkFileDialog.asksaveasfilename()
        self.file=open(self.savelocation, "w+")
        self.file.write(text)

    # this also has
    # the same problem. Once save as has
    # been called, it does not save when pressed
    # in first click but after a few clicks it
    # finaly saves.
    def save(self):
        try:
            text = self.t1.get(0.0, END)
            self.f1=open(self.file, "w+")
            self.f1.write(text)
        except IOError:
            text = self.t1.get(0.0, END)
            self.f1=open(self.savelocation, "w+")
            self.f1.write(text)
        except Exception:
            tkMessageBox.showinfo("Error", "Please save-as first.")
            raise

    #works fine!
    def open(self):
        self.file=tkFileDialog.askopenfilename()
        self.OpenFile=file(self.file) # get a file handle
        self.ReadFile= self.OpenFile.read() # read the file to variable
        self.OpenFile.close() # close file handle
        self.t1.delete(0.0, END)
        self.t1.insert(END, self.ReadFile)

root = Tk()
app = Main(root)
root.mainloop()

1 个答案:

答案 0 :(得分:2)

您的代码 正在保存数据。但是,您不能关闭文件和python缓冲区输出,因此磁盘上的文件可能实际上没有任何数据,直到某些原因导致文件被关闭(例如正常退出程序)。

简单的解决方案是确保在写入文件后关闭文件,最简单的方法是使用openwith语句。

def save(self):
    try:
        with open(self.file, "w+") as f1:
            texts = self.t1.get("1.0", "end-1c")
            f1.write(text)
    ...

在上面的代码中,当with块完成时,保证文件被关闭并且上下文被刷新到磁盘。

注意:您对索引0.0的使用不正确。索引必须是字符串,第一个字符是"1.0"而不是"0.0"。此外,Tkinter总是为文本小部件添加额外的换行符。如果您想要用户输入的内容,您需要获取除最后一个字符之外的所有字符,这是"end-1c"的含义(结束,减去一个字符)。