gpt4 book ai didi

python - Tkinter 文本小部件保存到文件

转载 作者:行者123 更新时间:2023-11-28 17:17:41 24 4
gpt4 key购买 nike

所以,我对使用 python 很陌生,我想了解更多关于它的信息,所以我决定从互联网上下载一个便签程序 (Rhinote) 并研究/修改它以使用菜单栏而不是控制命令来执行方法。我还修改了它以使用 Python 3.x 而不是 Python 2。

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

这是我目前的代码:

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()

这是我要修改的 Rhinote 程序:

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()

最佳答案

很高兴您改为使用菜单,但是您忘记了一件事,屏幕上显示的文本不是名为 text 的文本,而是在您检索来自 text 的数据是空的,因为它被 t 覆盖并且甚至没有打包:

t = Text(r, bg = '#f9f3a9', wrap = 'word', undo = True)
t.focus_set()
t.pack(fill = 'both', expand = 1)

由于您在其上使用了 focus_set,它将位于所有其他小部件之上。简单来说,您可以将程序更改为这样的内容,您甚至不需要 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')
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()

关于python - Tkinter 文本小部件保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43358304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com