Python Tkinter文本小部件保存到文件
因此,我对使用python非常陌生,我想了解更多,所以我决定从internet上下载一个便笺程序()并研究/修改它,使用菜单栏而不是控制命令来执行这些方法。我还将其修改为与Python3.x而不是Python2一起使用 在使用菜单栏修改后,我遇到的问题是,它创建了文件,但实际上并没有写入文件。我已经尝试解决这个问题一段时间了,所以非常感谢您的帮助 以下是我目前拥有的代码:Python Tkinter文本小部件保存到文件,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,因此,我对使用python非常陌生,我想了解更多,所以我决定从internet上下载一个便笺程序()并研究/修改它,使用菜单栏而不是控制命令来执行这些方法。我还将其修改为与Python3.x而不是Python2一起使用 在使用菜单栏修改后,我遇到的问题是,它创建了文件,但实际上并没有写入文件。我已经尝试解决这个问题一段时间了,所以非常感谢您的帮助 以下是我目前拥有的代码: from tkinter import * import tkinter.filedialog, tkinter.messa
from tkinter import *
import tkinter.filedialog, tkinter.messagebox
import os
from os import system
# the root window:
def Sticky():
r = Tk()
r.option_add('*font', '{Helvetica} 11')
t = Text(r, bg = '#f9f3a9', wrap = 'word', undo = True)
t.focus_set()
t.pack(fill = 'both', expand = 1)
r.geometry('220x235')
r.title('Note')
text = TextWidget()
m = tkinter.Menu(r)
m.add_command(label="+", command=text.new_window)
m.add_command(label="Save", command=text.save_file)
m.add_command(label="Save As", command=text.save_file_as)
m.add_command(label="Open", command=text.open_file)
r.config(menu=m)
r.mainloop()
# the text widget, and all of its functions:
class TextWidget(Text):
def __init__(self):
Text.__init__(self)
self.filename = ''
self._filetypes = [
('Text', '*.txt'),
('All files', '*'),
]
def save_file(self, whatever = None):
if (self.filename == ''):
self.save_file_as()
else:
f = open(self.filename, 'w')
f.write(self.get('1.0', 'end'))
f.close()
tkinter.messagebox.showinfo('FYI', 'File Saved.')
def save_file_as(self, whatever = None):
self.filename = tkinter.filedialog.asksaveasfilename(defaultextension='.txt',
filetypes = self._filetypes)
f = open(self.filename, 'w')
f.write(self.get('1.0', 'end'))
f.close()
tkinter.messagebox.showinfo('FYI', 'File Saved')
def open_file(self, whatever = None, filename = None):
if not filename:
self.filename = tkinter.filedialog.askopenfilename(filetypes = self._filetypes)
else:
self.filename = filename
if not (self.filename == ''):
f = open(self.filename, 'r')
f2 = f.read()
self.delete('1.0', 'end')
self.insert('1.0', f2)
f.close()
self.title('Sticky %s)' % self.filename)
def new_window(self):
Sticky()
def help(whatever = None):
tkinter.messagebox.showinfo('Help', message = '''
Help
''')
# make it so:
if __name__ == '__main__':
Sticky()
这是我试图修改的犀牛程序:
from tkinter import *
import tkinter.filedialog, tkinter.messagebox
import os
from os import system
# the root window:
def Rhinote():
r = Tk()
r.option_add('*font', '{Helvetica} 11')
t = TextWidget(r, bg = '#f9f3a9', wrap = 'word', undo = True)
t.focus_set()
t.pack(fill = 'both', expand = 1)
r.geometry('220x235')
r.title('Rhinote')
r.mainloop()
# the text widget, and all of its functions:
class TextWidget(Text):
def save_file(self, whatever = None):
if (self.filename == ''):
self.save_file_as()
self.master.title('Rhinote %s' % self.filename)
else:
f = open(self.filename, 'w')
f.write(self.get('1.0', 'end'))
f.close()
self.master.title('Rhinote %s' % self.filename)
tkinter.messageb ox.showinfo('FYI', 'File Saved.')
def save_file_as(self, whatever = None):
self.filename = tkinter.filedialog.asksaveasfilename(filetypes = self._filetypes)
f = open(self.filename, 'w')
f.write(self.get('1.0', 'end'))
f.close()
tkinter.messagebox.showinfo('FYI', 'File Saved')
def open_file(self, whatever = None, filename = None):
if not filename:
self.filename = tkinter.filedialog.askopenfilename(filetypes = self._filetypes)
self.master.title('Rhinote %s' % self.filename)
else:
self.filename = filename
self.master.title('Rhinote %s' % self.filename)
if not (self.filename == ''):
f = open(self.filename, 'r')
f2 = f.read()
self.delete('1.0', 'end')
self.insert('1.0', f2)
f.close()
self.master.title('Rhinote %s)' % self.filename)
def new_window(self, event):
Rhinote()
def printfile(self, whatever = None):
f = open(self.printfilename, 'w')
f.write(self.get('1.0', 'end'))
f.close
# 'enscript' formats the text; lpr sends it to the default printer;
# enscript's -B option suppresses page headers.
system('enscript -B --word-wrap $HOME/.Rhinoteprintfile > lpr &')
def help(self, whatever = None):
tkinter.messagebox.showinfo('Rhinote Help', message = '''
Editing Commands
Ctrl-x : Cut selected text
Ctrl-c : Copy selected text
Ctrl-v : Paste cut/copied text
Ctrl-Z : Undo
Ctrl-Shift-z : Redo
File Commands
Ctrl-o : Open file
Ctrl-s : Save current note
Ctrl-a : Save current note as <filename>
Ctrl-p : Print current note
Ctrl-n : Open new Rhinote
General
Ctrl-h : Display this help window
Rhinote version 0.7.4
Free Software distributed under the GNU General Public License
http://rhinote.tuxfamily.org
''')
def __init__(self, master, **kw):
Text.__init__(self, master, **kw)
self.bind('<Control-n>', self.new_window)
self.bind('<Control-N>', self.new_window)
self.bind('<Control-o>', self.open_file)
self.bind('<Control-O>', self.open_file)
self.bind('<Control-s>', self.save_file)
self.bind('<Control-S>', self.save_file)
self.bind('<Control-a>', self.save_file_as)
self.bind('<Control-A>', self.save_file_as)
self.bind('<Control-p>', self.printfile)
self.bind('<Control-P>', self.printfile)
self.bind('<Control-h>', self.help)
self.bind('<Control-H>', self.help)
self.master = master
self.filename = ''
self.printfilename = os.environ['HOME']+'/.Rhinoteprintfile'
self._filetypes = [
('Text/ASCII', '*.txt'),
('Rhinote files', '*.rhi'),
('All files', '*'),
]
# make it so:
if __name__ == '__main__':
Rhinote()
从tkinter导入*
导入tkinter.filedialog,tkinter.messagebox
导入操作系统
从操作系统导入系统
#根窗口:
def Rhinote():
r=Tk()
r、 选项添加('*font','{Helvetica}11')
t=TextWidget(r,bg='#f9f3a9',wrap='word',undo=True)
t、 焦点集()
t、 打包(填充=两个,展开=1)
r、 几何图形('220x235')
r、 标题(“犀牛”)
r、 mainloop()
#文本小部件及其所有功能:
类TextWidget(文本):
def save_文件(self,whatever=None):
如果(self.filename==''):
self.save_file_as()
self.master.title('Rhinote%s'%self.filename)
其他:
f=打开(self.filename,“w”)
f、 写入(self.get('1.0','end'))
f、 关闭()
self.master.title('Rhinote%s'%self.filename)
tkinter.messageb ox.showinfo('FYI','File Saved')
def save_file_as(self,whatever=None):
self.filename=tkinter.filedialog.asksaveasfilename(filetypes=self.\u filetypes)
f=打开(self.filename,“w”)
f、 写入(self.get('1.0','end'))
f、 关闭()
tkinter.messagebox.showinfo('FYI','File Saved')
def open_文件(self,whatever=None,filename=None):
如果不是文件名:
self.filename=tkinter.filedialog.askopenfilename(文件类型=self.\u文件类型)
self.master.title('Rhinote%s'%self.filename)
其他:
self.filename=文件名
self.master.title('Rhinote%s'%self.filename)
如果不是(self.filename==“”):
f=打开(self.filename,“r”)
f2=f.读取()
self.delete('1.0','end')
自插入('1.0',f2)
f、 关闭()
self.master.title('Rhinote%s)“%self.filename”)
def新窗口(自身、事件):
犀牛()
def打印文件(self,whatever=None):
f=打开(self.printfilename,“w”)
f、 写入(self.get('1.0','end'))
f、 接近
#“enscript”设置文本格式;lpr将其发送到默认打印机;
#enscript的-B选项禁止显示页面标题。
系统('enscript-B--wrap$HOME/.Rhinoteprintfile>lpr&'))
def帮助(self,whatever=None):
tkinter.messagebox.showinfo('Rhinote Help',message=''
编辑命令
Ctrl-x:剪切选定文本
Ctrl-c:复制所选文本
Ctrl-v:粘贴剪切/复制的文本
Ctrl-Z:撤消
Ctrl-Shift-z:重做
文件命令
Ctrl-o:打开文件
Ctrl-s:保存当前注释
Ctrl-a:将当前注释另存为
Ctrl-p:打印当前注释
Ctrl-n:打开新犀牛
一般的
Ctrl-h:显示此帮助窗口
犀牛版本0.7.4
根据GNU通用公共许可证发行的自由软件
http://rhinote.tuxfamily.org
''')
def _初始功率(自功率、主功率,**kw):
文本。\uuuuu初始值(自、主、**kw)
self.bind(“”,self.new_窗口)
self.bind(“”,self.new_窗口)
self.bind(“”,self.open_文件)
self.bind(“”,self.open_文件)
self.bind(“”,self.save_文件)
self.bind(“”,self.save_文件)
self.bind(“”,self.save_file_as)
self.bind(“”,self.save_file_as)
self.bind(“”,self.printfile)
self.bind(“”,self.printfile)
self.bind(“”,self.help)
self.bind(“”,self.help)
self.master=master
self.filename=“”
self.printfilename=os.environ['HOME']+'/.Rhinoteprintfile'
self.\u文件类型=[
('Text/ASCII','*.txt'),
('Rhinote files','*.rhi'),
(‘所有文件’、‘*’),
]
#这样做:
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
犀牛()
很高兴您改为使用菜单,但有一件事您忘记了,屏幕上显示的文本不是名为Text
的文本,而是在您从文本
检索数据时,该文本是空的,因为它被t
覆盖,甚至没有打包:
t = Text(r, bg = '#f9f3a9', wrap = 'word', undo = True)
t.focus_set()
t.pack(fill = 'both', expand = 1)
因为您在它上面使用了focus\u set
,它将比所有其他小部件都重要。简单地说,您可以将程序更改为类似这样的内容,您甚至不需要文本
from tkinter import *
import tkinter.filedialog, tkinter.messagebox
import os
from os import system
# the root window:
def Sticky():
r = Tk()
r.option_add('*font', '{Helvetica} 11')
t = Text(r, bg = '#f9f3a9', wrap = 'word', undo = True)
t.focus_set()
t.pack(fill = 'both', expand = 1)
r.geometry('220x235')
r.title('Note')
TextWidget(t) # pass along t, your Text
m = tkinter.Menu(r)
m.add_command(label="+", command=text.new_window)
m.add_command(label="Save", command=text.save_file)
m.add_command(label="Save As", command=text.save_file_as)
m.add_command(label="Open", command=text.open_file)
r.config(menu=m)
r.mainloop()
# the text widget, and all of its functions:
class TextWidget:
def __init__(self, text):
self.text = text # pass the text widget
self.filename = ''
self._filetypes = [
('Text', '*.txt'),
('All files', '*'),
]
def save_file(self, whatever = None):
if (self.filename == ''):
self.save_file_as()
else:
f = open(self.filename, 'w')
f.write(self.text.get('1.0', 'end')) # change every 'self' that refers to the Text, to self.text
f.close()
tkinter.messagebox.showinfo('FYI', 'File Saved.')
def save_file_as(self, whatever = None):
self.filename = tkinter.filedialog.asksaveasfilename(defaultextension='.txt',
filetypes = self._filetypes)
f = open(self.filename, 'w')
f.write(self.text.get('1.0', 'end'))
f.close()
tkinter.messagebox.showinfo('FYI', 'File Saved')
def open_file(self, whatever = None, filename = None):
if not filename:
self.filename = tkinter.filedialog.askopenfilename(filetypes = self._filetypes)
else:
self.filename = filename
if not (self.filename == ''):
f = open(self.filename, 'r')
f2 = f.read()
self.text.delete('1.0', 'end')
self.text.insert('1.0', f2)
f.close()
self.text.title('Sticky %s)' % self.filename)
def new_window(self):
Sticky()
def help(whatever = None):
tkinter.messagebox.showinfo('Help', message = '''
Help
''')
# make it so:
if __name__ == '__main__':
Sticky()
因为
TextWidget
是Text
子类,所以您应该在原始程序使用后者的地方使用它。为了实现这一点,它需要正确初始化它的超类
幸运的是,要做到这一点并正确使用它,不需要做太多改变。
以下是需要更改的代码部分:
from tkinter import *
import tkinter.filedialog, tkinter.messagebox
import os
from os import system
# the root window:
def Sticky():
r = Tk()
r.option_add('*font', '{Helvetica} 11')
text = TextWidget(r, bg='#f9f3a9', wrap='word', undo=True) # create subclass here (and
# call it text instead of t)
text.focus_set()
text.pack(fill='both', expand=1)
r.geometry('220x235')
r.title('Note')
m = tkinter.Menu(r)
m.add_command(label="+", command=text.new_window)
m.add_command(label="Save", command=text.save_file)
m.add_command(label="Save As", command=text.save_file_as)
m.add_command(label="Open", command=text.open_file)
r.config(menu=m)
r.mainloop()
# the text widget, and all of its functions:
class TextWidget(Text):
def __init__(self, *args, **kwargs):
Text.__init__(self, *args, **kwargs) # pass all args to superclass
self.filename = ''
self._filetypes = [
('Text', '*.txt'),
('All files', '*'),
]
def save_file(self, whatever=None):
REST OF YOUR CODE, UNCHANGED, GOES HERE...
非常感谢。我只需稍微编辑这一行,使函数调用工作,使其成为text=TextWidget(t)#传递t,你的文本在获取文本时,你应该使用
“end-1c”
,而不是“end”
,以避免得到tkinter添加的额外换行。