Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter文本小部件保存到文件_Python_Python 3.x_Tkinter - Fatal编程技术网

Python Tkinter文本小部件保存到文件

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

因此,我对使用python非常陌生,我想了解更多,所以我决定从internet上下载一个便笺程序()并研究/修改它,使用菜单栏而不是控制命令来执行这些方法。我还将其修改为与Python3.x而不是Python2一起使用

在使用菜单栏修改后,我遇到的问题是,它创建了文件,但实际上并没有写入文件。我已经尝试解决这个问题一段时间了,所以非常感谢您的帮助

以下是我目前拥有的代码:

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添加的额外换行。