Python创建保存按钮,将编辑的版本保存到同一个文件(不另存为)
Posted
技术标签:
【中文标题】Python创建保存按钮,将编辑的版本保存到同一个文件(不另存为)【英文标题】:Python create save button that saves an edited version to the same file(not save as) 【发布时间】:2014-04-03 20:15:48 【问题描述】:这是我目前正在编写的一个简单的记事本程序。 大多数事情都在工作,但无法让保存工作。 在我定义了保存的地方,我不知道如何创建保存功能(不另存为)。
不是完整的代码
from tkinter import *
from tkinter.messagebox import *
from tkinter.filedialog import *
from tkinter.font import *
import sys, time, sched, math
class Format:
def __init__(self, notepad):
print("Font")
class ZPad:
def __init__(self):
self.root = Tk()
self.root.title("ZPad")
self.root.wm_iconbitmap('Notepad.ico')
self.scrollbar = Scrollbar(self.root)
self.scrollbar.pack(side=RIGHT, fill=Y)
self.textbox = Text(self.root, yscrollcommand=self.scrollbar.set, undo=TRUE)
self.textbox.pack(side=LEFT, fill=BOTH, expand=YES)
#Menu Bar
self.menubar = Menu(self.root)
self.filemenu = Menu(self.menubar, tearoff=0)
self.filemenu.add_command(label="New", command=self.New, accelerator="Ctrl+N")
self.filemenu.add_command(label="Open...", command=self.open, accelerator="Ctrl+O")
self.filemenu.add_command(label="Save", command=self.Save, accelerator="Ctrl+S")
self.filemenu.add_command(label="Save as...", command=self.Save_as, accelerator="Ctrl+Shift+S")
self.filemenu.add_separator()
self.filemenu.add_command(label="Exit", command=self.quit, accelerator="Ctrl+Q")
self.menubar.add_cascade(label="File", menu=self.filemenu)
self.editmenu = Menu(self.menubar, tearoff=0)
self.editmenu.add_command(label="Undo", command=self.Undo, accelerator="Ctrl+Z")
self.editmenu.add_command(label="Redo", command=self.Redo, accelerator="Ctrl+Y")
self.editmenu.add_separator()
self.editmenu.add_command(label="Cut", command=self.Cut, accelerator="Ctrl+X")
self.editmenu.add_command(label="Copy", command=self.Copy, accelerator="Ctrl+C")
self.editmenu.add_command(label="Paste", command=self.Paste, accelerator="Ctrl+P")
self.editmenu.add_command(label="Clear All", command=self.Clear_All, accelerator="Ctrl+Shift+A")
self.editmenu.add_separator()
self.editmenu.add_command(label="Format", command=self.options, accelerator="Ctrl+T")
self.menubar.add_cascade(label="Edit", menu=self.editmenu)
self.helpmenu = Menu(self.menubar, tearoff=0)
self.helpmenu.add_command(label="About...", command=self.About)
self.menubar.add_cascade(label="Help", menu=self.helpmenu)
self.root.config(menu=self.menubar)
self.root.mainloop()
def Save(self):
print("Save")
def Save_as(self):
global file
file = tkinter.filedialog.asksaveasfile(mode='w', defaultextension=".z", filetypes = ( ("ztext file", "*.z"),("zytext", "*.zy") ) )
if file is None:
return
else:
print(file)
textoutput = self.textbox.get(0.0, END)
file.write(textoutput.rstrip())
file.write("\n")
notepad = ZPad()
我在 Windows 8.1 中使用 python 3.4。谢谢。
【问题讨论】:
你能检查你的代码块上的缩进吗?具体来说,save 和 save_as 函数在 zpad 类之外。那是对的吗?另外,您是在寻找编写保存函数的方法,还是调用它时出现错误,还是什么? 它们属于 ZPAD 类。我正在寻找一种方法来编写保存功能。 【参考方案1】:下面是一个使用 cmets 的保存和另存为函数的快速示例:
def save(self):
contents = self.textbox.get(1.0,"end-1c") #store the contents of the text widget in a str
try: #this try/except block checks to
with open(self.f, 'w') as outputFile: #see if the str containing the output
outputFile.write(contents) #file (self.f) exists, and we can write to it,
except AttributeError: #and if it doesn't,
self.save_as() #call save_as
def save_as(self):
contents = self.textbox.get(1.0,"end-1c")
self.f = tkFileDialog.asksaveasfilename( #this will make the file path a string
defaultextension=".z", #so it's easier to check if it exists
filetypes = (("ztext file", "*.z"), #in the save function
("zytext", "*.zy")))
with open(self.f, 'w') as outputFile:
outputFile.write(contents)
还有其他方法可以做到这一点,但这会在紧要关头起作用。想想save
函数需要什么:要保存的文本和要保存的文件,然后从那里开始。
【讨论】:
您应该使用"end-1c"
而不是END
。 Tkinter 总是添加一个额外的换行符。如果不注意这个小细节,每次打开文件并立即保存,都会增长一行。另外,第一个字符是1.0
,而不是0.0
谢谢,但它返回错误:Tkinter 回调回溯中的异常(最近一次调用最后一次):文件“C:\Users\Zac\Documents\School\notepad with classes.py”,第 133 行,在使用 open(self.f, 'w') 保存为 outputFile: AttributeError: 'ZPad' object has no attribute 'f'
在处理上述异常的过程中,又出现了一个异常: Traceback (last last call last): File "C:\Python34\lib\tkinter_init_.py", line 1482,在 call 中返回 self.func(*args) 文件 "C:\Users\Zac\Documents\School\notepad with classes.py",第 136 行,在 Save self.Save_as() 文件中“C:\Users\Zac\Documents\School\notepad with classes.py”,第 141 行,在 Save_as 中,使用 open(self.f, 'w') 作为输出文件:TypeError:无效文件:<_io.textiowrapper name=" C:/Users/Zac/Desktop/txy.z" mode="w" encoding="cp1252">以上是关于Python创建保存按钮,将编辑的版本保存到同一个文件(不另存为)的主要内容,如果未能解决你的问题,请参考以下文章