使用Tkinter Python 3的文本编辑器
我正在尝试构建一个包含不同选项卡的文本编辑器,每个选项卡都是一个文件,但问题是,当我尝试保存文件时,它没有读取任何内容,而是创建了一个没有内容的新文件。以前,我没有Tab类,它可以工作,但问题是它保存了所有具有相同内容的文件 代码如下:使用Tkinter Python 3的文本编辑器,python,tkinter,save,text-editor,text-widget,Python,Tkinter,Save,Text Editor,Text Widget,我正在尝试构建一个包含不同选项卡的文本编辑器,每个选项卡都是一个文件,但问题是,当我尝试保存文件时,它没有读取任何内容,而是创建了一个没有内容的新文件。以前,我没有Tab类,它可以工作,但问题是它保存了所有具有相同内容的文件 代码如下: from tkinter import * from tkinter import filedialog, ttk import os class App(): def __init__(self): title = 'New documen
from tkinter import *
from tkinter import filedialog, ttk
import os
class App():
def __init__(self):
title = 'New document'
self.root = Tk()
self.root.geometry('300x200')
self.root.iconbitmap('icon.ico')
self.root.title(title)
self.tabs = {'ky': 0}
self.notebook = ttk.Notebook(self.root)
self.notebook.pack(expand = True, fill= 'both')
menubar = Menu(self.root)
# create a pulldown menu, and add it to the menu bar
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="New...", command=self.generate_tab)
filemenu.add_command(label="Open", command = self.open_file)
filemenu.add_command(label="Save", command= self.save_file)
filemenu.add_separator()
filemenu.add_command(label="Exit", command= self.root.quit)
menubar.add_cascade(label="File", menu = filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Undo")
editmenu.add_command(label="Redo")
editmenu.add_separator()
menubar.add_cascade(label="Edit", menu=editmenu)
self.root.config(menu=menubar)
def open_file(self):
file = open(filedialog.askopenfilename(), 'r+')
text_value = file.read()
self.textWidget.delete(1.0, "end-1c")
self.textWidget.insert("end-1c", text_value)
title = os.path.basename(file.name)
self.root.title(title)
file.close()
def add_tab(self, name):
tab = Tab(self.notebook, name)
print(name)
self.notebook.add(tab, text=name)
def save_file(self):
self.get_tab().save_tab()
def get_tab(self):
tab = Tab(self.notebook, 'Document ' + str(self.notebook.index('current')))
return tab
def generate_tab(self):
if self.tabs['ky'] < 20:
self.tabs['ky'] += 1
self.add_tab('Document ' + str(self.tabs['ky']))
def run(self):
self.root.mainloop()
class Tab(Frame):
def __init__(self, root, name):
Frame.__init__(self, root)
self.root = root
self.name = name
self.textWidget = Text(self)
self.textWidget.pack(expand=True, fill='both')
def save_tab(self):
print(self.textWidget.get("1.0", 'end-1c'))
file = open(filedialog.asksaveasfilename() + '.txt', 'w+')
file.write(self.textWidget.get("1.0", 'end-1c'))
print(os.path.basename(file.name))
#title = os.path.basename(file.name)
file.close()
if __name__ == '__main__':
app1 = App()
app1.run()
从tkinter导入*
从tkinter导入文件对话框,ttk
导入操作系统
类App():
定义初始化(自):
标题='新文档'
self.root=Tk()
self.root.geometry('300x200')
self.root.iconbitmap('icon.ico'))
self.root.title(title)
self.tabs={'ky':0}
self.notebook=ttk.notebook(self.root)
self.notebook.pack(expand=True,fill='both')
菜单栏=菜单(self.root)
#创建下拉菜单,并将其添加到菜单栏
filemenu=Menu(menubar,tearoff=0)
filemenu.add_命令(label=“New…”,command=self.generate_选项卡)
filemenu.add_命令(label=“Open”,command=self.Open_文件)
filemenu.add_命令(label=“Save”,command=self.Save_文件)
filemenu.add_separator()
filemenu.add_命令(label=“Exit”,command=self.root.quit)
menubar.add_级联(label=“File”,menu=filemenu)
编辑菜单=菜单(菜单栏,TEAROF=0)
editmenu.add_命令(label=“Undo”)
editmenu.add_命令(label=“Redo”)
编辑菜单。添加分隔符()
菜单栏.add_级联(label=“Edit”,menu=editmenu)
self.root.config(menu=menubar)
def open_文件(自身):
file=open(filedialog.askopenfilename(),'r+')
text_value=file.read()
self.textWidget.delete(1.0,“end-1c”)
self.textWidget.insert(“end-1c”,text\u值)
title=os.path.basename(file.name)
self.root.title(title)
file.close()文件
def添加选项卡(自身,名称):
tab=tab(self.notebook,name)
印刷品(名称)
self.notebook.add(选项卡,文本=名称)
def保存_文件(自身):
self.get_tab().save_tab()
def get_选项卡(自身):
tab=tab(self.notebook,'Document'+str(self.notebook.index('current'))
返回选项卡
def生成_选项卡(自身):
如果self.tabs['ky']<20:
self.tabs['ky']+=1
self.add_选项卡('Document'+str(self.tabs['ky']))
def运行(自):
self.root.mainloop()
类别选项卡(框架):
定义初始化(self、root、name):
帧.\uuuu init\uuuuu(self,root)
self.root=根
self.name=名称
self.textWidget=Text(self)
self.textWidget.pack(expand=True,fill='both')
def保存选项卡(自身):
打印(self.textWidget.get(“1.0”,“end-1c”))
file=open(filedialog.asksaveasfilename()++'.txt',w++)
file.write(self.textWidget.get(“1.0”,“end-1c”))
打印(os.path.basename(file.name))
#title=os.path.basename(file.name)
file.close()文件
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app1=App()
app1.run()
问题在于您的获取选项卡
方法。它实际上并不返回表示当前打开的选项卡的对象。它返回一个没有内容的新选项卡
为了解决您的问题,您需要保留已创建选项卡的记录。我已经创建了一个“可行”版本,在创建每个选项卡时将其对象添加到列表中。这样,如果您当前处于“文档3”中并按“保存”,它将获得与文档3相关的选项卡对象
from tkinter import *
from tkinter import filedialog, ttk
import os
class App():
def __init__(self):
title = 'New document'
self.root = Tk()
self.root.geometry('300x200')
#self.root.iconbitmap('icon.ico')
self.root.title(title)
self.tabs = {'ky': 0}
#Keep a record of the open tabs in a list.
self.tab_list = []
self.notebook = ttk.Notebook(self.root)
self.notebook.pack(expand = True, fill= 'both')
menubar = Menu(self.root)
# create a pulldown menu, and add it to the menu bar
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="New...", command=self.generate_tab)
filemenu.add_command(label="Open", command = self.open_file)
filemenu.add_command(label="Save", command= self.save_file)
filemenu.add_separator()
filemenu.add_command(label="Exit", command= self.root.quit)
menubar.add_cascade(label="File", menu = filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Undo")
editmenu.add_command(label="Redo")
editmenu.add_separator()
menubar.add_cascade(label="Edit", menu=editmenu)
self.root.config(menu=menubar)
def open_file(self):
file = open(filedialog.askopenfilename(), 'r+')
text_value = file.read()
self.textWidget.delete(1.0, "end-1c")
self.textWidget.insert("end-1c", text_value)
title = os.path.basename(file.name)
self.root.title(title)
file.close()
def add_tab(self, name):
tab = Tab(self.notebook, name)
print(name)
self.notebook.add(tab, text=name)
self.tab_list.append(tab)
def save_file(self):
tab_to_save = self.get_tab()
print(tab_to_save)
tab_to_save.save_tab()
def get_tab(self):
print(self.notebook.index('current'))
#Get the tab object from the tab_list based on the index of the currently selected tab
tab = self.tab_list[self.notebook.index('current')]
return tab
def generate_tab(self):
if self.tabs['ky'] < 20:
self.tabs['ky'] += 1
self.add_tab('Document ' + str(self.tabs['ky']))
def run(self):
self.root.mainloop()
class Tab(Frame):
def __init__(self, root, name):
Frame.__init__(self, root)
self.root = root
self.name = name
self.textWidget = Text(self)
self.textWidget.pack(expand=True, fill='both')
def save_tab(self):
print(self.textWidget.get("1.0", 'end-1c'))
file = open(filedialog.asksaveasfilename() + '.txt', 'w+')
file.write(self.textWidget.get("1.0", 'end-1c'))
print(os.path.basename(file.name))
#title = os.path.basename(file.name)
file.close()
if __name__ == '__main__':
app1 = App()
app1.run()
从tkinter导入*
从tkinter导入文件对话框,ttk
导入操作系统
类App():
定义初始化(自):
标题='新文档'
self.root=Tk()
self.root.geometry('300x200')
#self.root.iconbitmap('icon.ico'))
self.root.title(title)
self.tabs={'ky':0}
#在列表中记录打开的选项卡。
self.tab_list=[]
self.notebook=ttk.notebook(self.root)
self.notebook.pack(expand=True,fill='both')
菜单栏=菜单(self.root)
#创建下拉菜单,并将其添加到菜单栏
filemenu=Menu(menubar,tearoff=0)
filemenu.add_命令(label=“New…”,command=self.generate_选项卡)
filemenu.add_命令(label=“Open”,command=self.Open_文件)
filemenu.add_命令(label=“Save”,command=self.Save_文件)
filemenu.add_separator()
filemenu.add_命令(label=“Exit”,command=self.root.quit)
menubar.add_级联(label=“File”,menu=filemenu)
编辑菜单=菜单(菜单栏,TEAROF=0)
editmenu.add_命令(label=“Undo”)
editmenu.add_命令(label=“Redo”)
编辑菜单。添加分隔符()
菜单栏.add_级联(label=“Edit”,menu=editmenu)
self.root.config(menu=menubar)
def open_文件(自身):
file=open(filedialog.askopenfilename(),'r+')
text_value=file.read()
self.textWidget.delete(1.0,“end-1c”)
self.textWidget.insert(“end-1c”,text\u值)
title=os.path.basename(file.name)
self.root.title(title)
file.close()文件
def添加选项卡(自身,名称):
tab=tab(self.notebook,name)
印刷品(名称)
self.notebook.add(选项卡,文本=名称)
self.tab\u list.append(选项卡)
def保存_文件(自身):
tab_to_save=self.get_tab()
打印(制表符保存)
tab_to_save.save_tab()
def get_选项卡(自身):
打印(self.notebook.index('current'))
#根据当前选定选项卡的索引,从选项卡列表中获取选项卡对象
tab=self.tab\u列表[self.notebook.index('current')]
返回选项卡
def生成_选项卡(自身):
如果self.tabs['ky']<20:
self.tabs['ky']+=1
self.add_选项卡('Document'+str(self.tabs['ky']))
def运行(自):
self.root.mainloop()
类别选项卡(框架):
定义初始化(self、root、name):
帧.\uuuu init\uuuuu(self,root)
self.root=根
self.name=名称
self.textWidget=Text(self)
self.textWidget.pack(expand=True,fill='both')
def保存选项卡(自身):
打印(self.textWidget.get(“1.0”,“end-1c”))
file=open(filedialog.asksaveasfilename()++'.txt',w++)
file.write(self.textWidget.get(“1.0”,“end-1c”))
打印(os.path.basena)