Tkinter中的保存文件对话框

23
我正在Python中实现一个基于GUI的文本编辑器。 我已经显示了文本区域,但是当我尝试在Tkinter中使用asksaveasfile方法时,它会显示文件已保存,但是当我尝试在我的桌面编辑器中打开同一文件时,它给了我一个空文件。
只有文件被创建并保存了。 它的内容不是。
我想知道为什么。 我做错了什么吗? 这是我的代码:
from Tkinter import *
import tkMessageBox
import Tkinter
import tkFileDialog

def donothing():
   print "a"

def file_save():
    name=asksaveasfile(mode='w',defaultextension=".txt")
    text2save=str(text.get(0.0,END))
    name.write(text2save)
    name.close

root = Tk()
root.geometry("500x500")
menubar=Menu(root)
text=Text(root)
text.pack()
filemenu=Menu(menubar,tearoff=0)
filemenu.add_command(label="New", command=donothing)
filemenu.add_command(label="Open", command=donothing)
filemenu.add_command(label="Save", command=file_save)
filemenu.add_command(label="Save as...", command=donothing)
filemenu.add_command(label="Close", command=donothing)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)

editmenu=Menu(menubar,tearoff=0)
editmenu.add_command(label="Undo", command=donothing)
editmenu.add_command(label="Copy", command=donothing)
editmenu.add_command(label="Paste", command=donothing)
menubar.add_cascade(label="Edit", menu=editmenu)

helpmenu=Menu(menubar,tearoff=0)
helpmenu.add_command(label="Help",command=donothing)
menubar.add_cascade(label="Help",menu=helpmenu)

root.config(menu=menubar)
root.mainloop()  
2个回答

45

函数名称是asksaveasfilename。它应该被限定为tkFileDialog.asksaveasfilename。并且它不接受mode参数。

也许您想使用tkFileDialog.asksaveasfile

def file_save():
    f = tkFileDialog.asksaveasfile(mode='w', defaultextension=".txt")
    if f is None: # asksaveasfile return `None` if dialog closed with "cancel".
        return
    text2save = str(text.get(1.0, END)) # starts from `1.0`, not `0.0`
    f.write(text2save)
    f.close() # `()` was missing.

它可以工作。我认为是因为括号的原因它没有工作。 - Rohit Shinde
你刚刚编辑说索引从1.0开始,但是即使我将起始索引设置为0.0,我的文本也完好保存。 - Rohit Shinde
5
@RohitShinde,将索引指定为(0.0, END)可以获取整个文本,但指定为(1.0, END)才是正确的方式。如果您想要第二行,则应指定2.x而不是1.x - falsetru

1

由于某些原因,当我写下以下代码时:

CodeToSave = str(text.get(1.0, END))

"text"被标记为红色并显示为未解决的引用。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接